【问题标题】:How does StreamWriter class actually work?StreamWriter 类实际上是如何工作的?
【发布时间】:2016-07-24 09:28:31
【问题描述】:

考虑一个名为!file io test.txt 的文件,其中包含以下几行:

1|adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|1080000

并考虑这个代码段:

FileStream fs = new FileStream(@"C:\Users\McLovin\Desktop\!file io test.txt", FileMode.Open, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
StreamReader sr = new StreamReader(fs);
char c = (char)sr.Read(); // line 4
sw.Write('~');
sw.Flush();

在第 4 行之后,文件指针应该已经读取了第一个字符并将自身移动到第二个字符。这在我读取文件时按预期工作,但是当我写入文件指针时,它总是指向文件的末尾并开始在那里写入。如果我将第 4 行注释掉,StreamWriter 将正常工作(从头开始覆盖文件)。

当前代码产生:

1|adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|108000
~

但我希望它产生这个:

1~adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|1080000

【问题讨论】:

  • 基本上,我建议避免同时使用 StreamWriter 和 StreamReader 包装相同的 Stream。这几乎可以肯定是StreamReader.Read 读取整个数据缓冲区的问题...
  • 对了,你可以在这里看看StreamWriter的内部结构:referencesource.microsoft.com/#mscorlib/system/io/…
  • 同意@JonSkeet。将流 pos 重置为 0,以从 BOF 开始写入。

标签: c# file-io filestream streamreader streamwriter


【解决方案1】:

如果您想这样做,则需要在读取后重置流。

numOfBytesRead = 1;
fs.Seek(numOfBytesRead, SeekOrigin.Begin); 

我怀疑问题出在 StreamReader 的内部缓冲区上。您得到一个单字节输出,但在内部,阅读器已经提前读取了一点以填充缓冲区并将流的位置留在实际读取到的任何位置。

您使用的构造函数重载导致缓冲区大小为 1024 字节。您的文件的内容远低于该内容,因此在您的读取调用后,流的位置留在了末尾。如果您将文件的大小增加到超过该大小,您将看到波浪号将不再写入末尾。

有趣的是,看起来缓冲区不能设置为低于 128 字节。

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多