我发现它会一遍又一遍地返回相同的读取字符,但我想知道是否有更优雅的方法。
我发现它会一遍又一遍地返回相同的读取字符,但我想知道是否有更优雅的方法。
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
请查看StreamReader.EndOfStream。当此值为true
时,请停止读取循环。
确保您的代码正确处理ReadBlock
调用返回的“刚刚读取的字节数”值。听起来您正在看到零字节被读取,并且只是假设您看到的未更改的缓冲区内容是同一数据的另一个读取。
当返回的读取长度小于你请求的读取长度时,你已经到达了文件末尾。此外,你应该跟踪读取长度,以防流大小与缓冲区大小不完全匹配,因此需要考虑缓冲区中数据的较短长度。
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(len == buffer.Length);
EndOfStream
标志。我更喜欢这种方法,因为你不会读取长度为'0'的内容(虽然很少见,但确实可能发生)。do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(!stream.EndOfStream);
很抱歉,我目前还不能对答案进行评论,但是针对“The Moof”的回答...
你在这里使用cur
是错误的,因为index
参数是指在buffer
中开始写入的索引。所以在你的示例中,应该在调用stream.ReadBlock
时将其替换为0
。
从MSDN了解ReadBlock()
:
返回值类型:System.Int32。缓冲区中读入的字符数将用于推进基础流的位置。已读取的字符数。该数字将小于或等于计数,具体取决于是否已读取所有输入字符。
因此,当返回0时,我会认为它是EOF。
TcpClient.GetStream
下面的NetworkStream
,如果远程端先终止连接,访问EndOfStream
会导致IOException
:无法从传输连接读取数据: 远程主机强制关闭了一个现有的连接。---> System.Net.Sockets.SocketException: 远程主机强制关闭了一个现有的连接
。 - KFL