c#FileStream读取StreamReader EndOfStream存在问题
正如标题所说,我发现了一个问题.小故事第一:
我们有file.txt看起来像这样: aaaabb ccccddd eeeefffffff 有许多方法可以逐行阅读本文,其中一种方法是: StreamReader sr = new StreamReader("file.txt"); while(!sr.EndOfStream) { string s = sr.ReadLine(); } sr.Close(); 作品.获得每一行. FileStream fs = new FileStream("file.txt",FileMode.Open); StreamReader sr = new StreamReader(fs); byte[] arr = new byte[4]; fs.Read(arr,4); string s = sr.ReadLine(); sr.Close(); fs.Close(); 作品. arr包含前4个字母作为字节,其余部分保存在s中.这只是一行.如果我们添加while: FileStream fs = new FileStream("file.txt",FileMode.Open); StreamReader sr = new StreamReader(fs); while(!sr.EndOfStream) { byte[] arr = new byte[4]; fs.Read(arr,4); string s = sr.ReadLine(); } sr.Close(); fs.Close(); 现在有一个问题.现在arr没有得到任何东西,并且s读取整行,包括前4个字母.更奇怪的是,如果我使用while(true)(并且我假设其他任何不是示例)而不是按预期工作,则4个字符作为字节,其余为字符串,这对于每一行都是相同的. 问题是我错过了什么?为什么会这样?我该如何解决这个问题?或者这可能是一个错误? 解决方法
这里的问题是简单的缓冲.当您将StreamReader附加到FileStream时,它最终会从文件中占用一个块,从而推进FileStream的当前位置.使用您的示例文件和默认缓冲区大小,一旦StreamReader附加自身,它基本上将整个文件消耗到缓冲区中,使FileStream保持其EOF.然后,当您尝试直接通过fs引用从FileStream读取4个字节时,没有什么可以消耗的.以下ReadLine适用于您的sr引用,因为它是从缓冲文件内容中读取的.
以下是对正在发生的事情的逐步细分: > fs打开文件并位于位置0. 要修复特定的错误情况,可以将字节数组更改为char数组,然后使用sr.Read.即 char[] arr = new char[4]; sr.Read(arr,4); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |