我有一个(text/Binary)格式的大文件。
文件格式:( 0
代表一个字节)
00000FileName0000000Hello
World
world1
...
0000000000000000000000
目前我正在使用FileStream
,我想读取Hello.
我知道Hello从哪里开始,它以0x0D 0x0A结束。
如果单词不等于Hello,我也需要返回。
我如何读取直到一个回车符返回?
在FileStream
中是否有任何PEEK
类似的功能,因此我可以向后移动读指针?
在这种情况下FileStream
是一个好的选择吗?
可以使用FileStream方法。请求更改读/写位置
您可以使用BinaryReader
读取二进制内容;然而,它使用一个内部缓冲区,所以你不能再依赖底层的Stream.Position
了,因为它可以在后台读取比你想要的更多的字节。但是你可以重新实现它需要的方法:
private byte[] ReadBytes(Stream s, int count)
{
buffer = new byte[count];
if (count == 0)
{
return buffer;
}
// reading one byte
if (count == 1)
{
int value = s.ReadByte();
if (value == -1)
threw new IOException("Out of stream");
buffer[0] = (byte)value;
return buffer;
}
// reading multiple bytes
int offset = 0;
do
{
int readBytes = s.Read(buffer, offset, count - offset);
if (readBytes == 0)
threw new IOException("Out of stream");
offset += readBytes;
}
while (offset < count);
return buffer;
}
public int ReadInt32(Stream s)
{
byte[] buffer = ReadBytes(s, 4);
return BitConverter.ToInt32(buffer, 0);
}
// similarly, write ReadInt16/64, etc, whatever you need
假设你在起始位置,你也可以写一个ReadString
:
private string ReadString(Stream s, char delimiter)
{
var result = new List<char>();
int c;
while ((c = s.ReadByte()) != -1 && (char)c != delimiter)
{
result.Add((char)c);
}
return new string(result.ToArray());
}
用法:
FileStream fs = GetMyFile(); // todo
if (!fs.CanSeek)
throw new NotSupportedException("sorry");
long posCurrent = fs.Position; // save current position
int posHello = ReadInt32(fs); // read position of "hello"
fs.Seek(posHello, SeekOrigin.Begin); // seeking to hello
string hello = ReadString(fs, 'n'); // reading hello
fs.Seek(posCurrent, SeekOrigin.Begin); // seeking back