Pet*_*nov 4 c# idisposable stream
使用StreamReader,如果你处理底层流,我认为你不应该再读了.
这是真的表明这个问题,如果底层流的生命在其他地方处理,那么建议您不必处置StreamWriter(在他们的情况下).
但事实并非如此.我做的是以下内容:
我有一个名为delme.txt包含以下内容的文件
abc
def
ghi
Run Code Online (Sandbox Code Playgroud)
我跑这个:
Stream s = File.OpenRead(@"C:\delme.txt");
StreamReader sr = new StreamReader(s, Encoding.ASCII);
Console.WriteLine(sr.ReadLine());
s.Dispose();
Console.WriteLine(sr.ReadLine());
Run Code Online (Sandbox Code Playgroud)
结果是:
abc
def
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
SLa*_*aks 10
您StreamReader已经将下一行读入其缓冲区.在缓冲区中的数据耗尽之前,它
不会返回源Stream.
实际上,在这种情况下它不可能抛出异常,因为没有幂等方法来确定是否Stream已经处置掉了.(没有IsDisposed财产)
要添加到@SLaks答案,这里将演示(使用包含几千行文本的文件):
Stream s = File.OpenRead(path);
StreamReader sr = new StreamReader(s, Encoding.ASCII);
Console.WriteLine(sr.ReadLine());
s.Dispose();
int i = 1;
try
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
i++;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine(i + " lines total");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
它将打印出很多很多行,比如几百行,然后会抛出异常.我的输出像这样结束:
qrs
tuv
wxy
zab
cde
fgh
ijk
lmn
Cannot access a closed file.
204 lines total
Run Code Online (Sandbox Code Playgroud)
事实上,我们看到有一个构造函数StreamReader,它将参数bufferSize作为第四个参数:
StreamReader sr = new StreamReader(s, Encoding.ASCII, false, 10000);
Run Code Online (Sandbox Code Playgroud)
使用10000,它实际上在崩溃之前为我打印了总共1248行.此外,您可以使用的最小可能值是1,对于这种情况,它仍然预取25行.