我有以下c#代码:
private const int APPENDBUFFERSIZE = 65536;
private StreamWriter _streamWriter;
private FileStream _fileStream;
private BufferedStream _bufferedStream;
public void Open(string fileName)
{
_fileStream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
_bufferedStream = new BufferedStream(_fileStream, APPENDBUFFERSIZE);
_streamWriter = new StreamWriter(_bufferedStream);
}
public void Write(string data)
{
_streamWriter.Write(data);
}
public void Close()
{
if (_streamWriter != null)
{
_streamWriter.Flush();
_streamWriter.Dispose();
_streamWriter = null;
}
if (_bufferedStream != null)
{
_bufferedStream.Dispose();
_bufferedStream = null;
}
if (_fileStream != null)
{
_fileStream.Dispose();
_fileStream = null;
}
}
为什么直到我调用Close才将数据写入磁盘?技术数据:我写了9000 KB的数据
StreamWriter
类有:
internal const int DefaultBufferSize = 1024;
FileStream
类有:
internal const int DefaultBufferSize = 4096;
BufferedStream
为65536
字节。filename
是我本地驱动器d上文件的完整路径。
filename = "D:\Folder1Folder2\file.txt"
我确实有权限写它。对于Write
的调用,我使用类似的东西:
data = "1234567889|ababababababababbabababababababababababab"
同样,我不想摆脱缓冲区,我只想让流时不时地被刷新,并在磁盘上看到它。把文件放到0 KB
很奇怪,当你关闭它的时候,它突然变大了。因此,通过所有测量,除非写入下一个流/磁盘,否则所有缓冲区都应该溢出。但是,在Close
之后,Windows只显示大于0 KB
的文件大小,尽管我在写入文件完成后等待了几分钟。
任何想法?
谢谢,Ciprian。
UPDATE: windows资源管理器大小列中的大小显示为0。如果我查看文件属性,那么大小大于0(这是正确的)。从属性窗口返回并刷新windows资源管理器窗口后,size列更新为大于0的值。如果我只是刷新windows资源管理器窗口,而不查看文件属性,大小列保持为0。此外,如果我用notepad++打开文件,它具有所有数据,并且在windows资源管理器窗口上刷新会在大小列中显示正确的值。所以我的问题可能不是由于我写的代码,但你永远不会知道。
直接来自马的嘴(又名MSDN):
增加一个缓冲层,用于对另一个流进行读写操作。这个类不能被继承。
再往下,在备注部分:
缓冲区是内存中的一个字节块,用于缓存数据,从而减少对操作系统的调用次数
https://msdn.microsoft.com/en-us/library/system.io.bufferedstream (v = vs.110) . aspx
因此,根据文档,您的代码的行为是预期的。除非发生以下三个事件之一,否则不会向磁盘写入任何内容:
- 你
Close()
缓冲流 - 你的
Flush()
它 - 缓冲区已满
HTH…
你使用了BufferedStream,它不会刷新任何东西,直到你在缓冲区中达到65536字节,或者你调用flush方法,或者你调用Close方法。如果你想要更快的结果,取出BufferedStream或将其大小更改为较小的数字。
只有当StreamWriter刷新(或关闭)时,它才会写入BufferedStream,只有当BufferedStream刷新(或关闭)时,它才会写入FileStream。
此外,Windows(设备)文件缓冲区需要做它的神奇AFTER . net处理,最终你无法控制它何时实际将数据持久化到设备。