streamreader 的基本流位置使用单声道
streamreader's basestream position using mono
我正在尝试编写一些简单的代码来索引一些维基百科 xml 页面。我的想法是通过使用 streamreader 读取一个字符来获取每个字符的字节偏移量,然后从字节流中保存该位置,以便稍后我可以返回到该位置。
使用仅包含“感\na\nb”(8 字节)且每个字符后换行的简短测试文件。然后我尝试在主函数中使用这段代码:
using System;
using System.IO;
namespace indexer
{
class MainClass
{
public static void Main(string[] args)
{
StreamReader sr = new StreamReader (@"/home/chris/Documents/len.txt");
Console.Out.WriteLine(" length of file is " + sr.BaseStream.Length + " bytes ");
sr.Read (); // read first byte.
Console.Out.WriteLine(" current position is " + sr.BaseStream.Position);
sr.Close ();
}
}
}
这给出了输出:
length of file is 8 bytes
current position is 8
位置应该是3,因为它应该只读取第一个字符。如果我再次使用 sr.Read() ,我会正确获取下一个字符,但位置仍然是 8.
我是不是误解了它应该如何工作,还是我发现了某种错误?
谢谢。
不,这不是错误。 StreamReader
使用一个 1 KB 的缓冲区,当您调用 StremReader.Read()
.
时缓冲区会被填满
您应该调用 Encoding.GetByteCount()
方法来获取正在读取的字符或字符串中的字节数。当前编码可以在 StreamReader.CurrentEncoding
.
中找到
我正在尝试编写一些简单的代码来索引一些维基百科 xml 页面。我的想法是通过使用 streamreader 读取一个字符来获取每个字符的字节偏移量,然后从字节流中保存该位置,以便稍后我可以返回到该位置。
使用仅包含“感\na\nb”(8 字节)且每个字符后换行的简短测试文件。然后我尝试在主函数中使用这段代码:
using System;
using System.IO;
namespace indexer
{
class MainClass
{
public static void Main(string[] args)
{
StreamReader sr = new StreamReader (@"/home/chris/Documents/len.txt");
Console.Out.WriteLine(" length of file is " + sr.BaseStream.Length + " bytes ");
sr.Read (); // read first byte.
Console.Out.WriteLine(" current position is " + sr.BaseStream.Position);
sr.Close ();
}
}
}
这给出了输出:
length of file is 8 bytes
current position is 8
位置应该是3,因为它应该只读取第一个字符。如果我再次使用 sr.Read() ,我会正确获取下一个字符,但位置仍然是 8.
我是不是误解了它应该如何工作,还是我发现了某种错误?
谢谢。
不,这不是错误。 StreamReader
使用一个 1 KB 的缓冲区,当您调用 StremReader.Read()
.
您应该调用 Encoding.GetByteCount()
方法来获取正在读取的字符或字符串中的字节数。当前编码可以在 StreamReader.CurrentEncoding
.