StreamWriter class 是如何工作的?

How does StreamWriter class actually work?

考虑一个名为 !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

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

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

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

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

有趣的是,缓冲区似乎也不能设置为低于 128 字节。