C#初学者文件阅读

C# Beginner File Reading

好的,我搜索了这个问题的答案,但找不到。

代码如下:

     FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

        byte[] fileText = new byte[fs.Length];

        int bytesRead = fs.Read(fileText, 0, fileText.Length);

        Console.WriteLine(Encoding.ASCII.GetString(fileText, 0, bytesRead));

让我直截了当地说,

  1. 我们声明一个文件流
  2. 我们声明一个字节数组..并将其容量设置为fs.Length
  3. ????为什么 fs.Read() return 是一个整数 ???
  4. ???此行如何将 .txt 文件中的文本显示到控制台?我们在getstring()方法中传入了byte[],但是那个byte[]不是空的吗?我们只将其容量设置为fs.length?阅读发生在哪里以及如何进行?

TIA

如果您尝试读取文本文件并在控制台中显示所有行

foreach(string line in File.ReadAllLines("YourFilePath"))
{
    Console.WriteLine(line);
}

用你的方法

FileStream fs = new FileStream("YourFilePath", FileMode.Open, FileAccess.Read);

打开文件以读入流 fs。

byte[] fileText = new byte[fs.Length];

获取文件内容中的字节数,并创建该大小的字节数组

int bytesRead = fs.Read(fileText, 0, fileText.Length);

读取字节内容,从 0 到内容结尾(我们有上一条语句的长度),即完整的内容到您创建的数组中。所以,现在您的字节数组 fileText 包含文件中的所有字节内容。

它 returns 在此操作中读取的字节数,如果出于某种原因需要的话。这可以是 <= 您想要读取的字节数(如果文件内容中可用的字节数较少,则更少)。在您的情况下,它将与 fileText.Length 相同,因为您已经计算过了。

System.Console.WriteLine(Encoding.ASCII.GetString(fileText, 0, bytesRead));

将字节数组转换为 ASCII 编码文本并写入控制台。

FileStream.Read() returns实际读取的字节数。可能是您要求 4096 字节,但得到的是 0、1 或 1000。这就是文档所说的:

Return Value Type: System.Int32 The total number of bytes read into the buffer. This might be less than the number of bytes requested if that number of bytes are not currently available, or zero if the end of the stream is reached.

如果您正在阅读文本,您可以使用其中一种有用的 File 方法:File.ReadAllText, File.ReadAllLines, or File.OpenText 它会为您提供一个 StreamReader 对象,您可以在其中逐行阅读。

如果你需要读取字节(这是一个低级的用法,实际上你应该能够使用 StreamReader),那么你不想创建一个缓冲区的长度的流,因为这可能会使您的程序崩溃 OutOfMemoryException。相反,使缓冲区类似于 4096 字节,然后在循环中调用 FileStream.Read,直到它 returns 0。但是请注意,您不是在此处读取文本行,并且可能会出现换行符缓冲区的中间。这是一个例子:

using (var fileStream = File.OpenRead("c:\file.txt"))
{
    var buffer = new Byte[4096];
    var offset = 0;
    var read = 0;
    while ((read = fileStream.Read(buffer, offset, buffer.Length)) > 0)
    {
        var s = Encoding.ASCII.GetString(buffer, 0, read);
        Console.Write(s);
        offset += read;
    }
}

读取方法returns 读入缓冲区参数的字节数。您传入了一个数组,该数组将在实际调用 Read 方法时填充数据。您还传递了要读取的字节数。 阅读 msdn 文档了解更多详情 here

3) 已经在这里回答了。

至于 4):Read 方法实际上也用字节填充缓冲区,returns 它填充到缓冲区的字节数。

将缓冲区和读取的字节数传递给 Encoding. GetString() 将文件中的字节解释为给定编码的字符代码,在您的例子中是 ASCII,并根据字节数组创建一个字符串编码。