文件流分隔符

本文关键字:分隔符 文件 | 更新日期: 2023-09-27 18:19:06

我有一个(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