【问题标题】:C# Beginner File ReadingC# 初学者文件读取
【发布时间】:2015-09-13 07:10:29
【问题描述】:

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

代码如下:

     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. 我们声明一个字节数组..并将其 CAPACITY 设置为 fs.Length
  3. ????为什么 fs.Read() 返回一个 INTEGER ???
  4. ???此行如何将 .txt 文件中的文本显示到控制台?我们在 getstring() 方法中传入了 byte[],但是那个 byte[] 不是空的吗?我们只将其容量设置为 fs.length?阅读是在哪里进行的?如何阅读?

TIA

【问题讨论】:

  • 你的目标是什么?你有一个文本文件,那么你想用它做什么?
  • 3) Read() 返回实际读取的字节数,因为它可能小于请求的字节数。 4)示例中的Read方法()将数据放入数组filetext中,因此执行读取后filetext不为空。
  • 好的。所以它用所有字符的ASCII码填充字节[]?
  • 文件只有“Hello World!”写在里面

标签: c# io filestream


【解决方案1】:

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

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 包含了文件中的所有字节内容。

如果出于某种原因需要,它会返回此操作中读取的字节数。这可以是

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

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

【讨论】:

  • 谢谢,但我需要知道这个方法并理解它:D
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    返回值 类型:System.Int32 读入缓冲区的总字节数。如果该字节数当前不可用,则该字节数可能小于请求的字节数,如果到达流的末尾,则该字节数为零。

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

    如果您需要读取字节(这是一种低级用法,实际上您应该能够使用StreamReader),那么您不想创建一个流长度的缓冲区,因为这可能会使您的程序因OutOfMemoryException 而崩溃。相反,将缓冲区设置为 4096 字节,然后在循环中调用FileStream.Read,直到它返回 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;
        }
    }
    

    【讨论】:

      【解决方案4】:

      3) 已经在这里回答了。

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

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

      【讨论】:

      • byte[] 到底填了什么,.txt 文件中各个字符的 ASCII 码?
      • 准确地说是“文件包含的字节数”。字节的解释取决于你。文件(因此是文件流)实际上只是一个字节序列。要将它们解释为文本,您必须知道编码。例如,UTF16 编码需要两个字节的幂字符。如果您知道您正在阅读文本文件,那么有专门的方法可以轻松阅读这些文件。其中一些已在其他答案中提到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多