gpt4 book ai didi

c# - 无缓冲 StreamReader

转载 作者:可可西里 更新时间:2023-11-01 03:02:00 25 4
gpt4 key购买 nike

有没有办法让 StreamReader 不做任何缓冲?

我正在尝试处理可能是二进制或文本的进程的输出。输出看起来像一个 HTTP 响应,例如

Content-type: application/whatever
Another-header: value

text or binary data here

我想做的是使用 StreamReader 解析 header ,然后从其 BaseStreamStreamReader 读取以处理其余的内容。这基本上是我开始的内容:

private static readonly Regex HttpHeader = new Regex("([^:]+): *(.*)");
private void HandleOutput(StreamReader reader)
{
var headers = new NameValueCollection();
string line;
while((line = reader.ReadLine()) != null)
{
Match header = HttpHeader.Match(line);
if(header.Success)
{
headers.Add(header.Groups[1].Value, header.Groups[2].Value);
}
else
{
break;
}
}
DoStuff(reader.ReadToEnd());
}

这似乎是垃圾二进制数据。所以我把最后一行改成了这样:

if(headers["Content-type"] != "text/html")
{
// reader.BaseStream.Position is not at the same place that reader
// makes it looks like it is.
// i.e. reader.Read() != reader.BaseStream.Read()
DoBinaryStuff(reader.BaseStream);
}
else
{
DoTextStuff(reader.ReadToEnd());
}

... 但 StreamReader 缓冲其输入,因此 reader.BaseStream 处于错误的位置。有没有办法取消缓冲 StreamReader?或者我可以告诉 StreamReader 将流重置回 StreamReader 所在的位置吗?

最佳答案

这个答案来晚了,可能与您不再相关,但对于偶然发现此问题的其他人可能会派上用场。

我的问题涉及PPM files , 具有类似的格式:

  • 开头为 ASCII 文本
  • 文件其余部分的二进制字节

我遇到的问题是 StreamReader 类无法在不缓冲内容的情况下一次读取一个字节。这在某些情况下会导致意外结果,因为 Read() 方法读取单个字符,而不是单个字节。

我的解决方案是围绕流编写一个包装器,一次读取一个字节。包装器有 2 个重要方法,ReadLine()Read()

这 2 种方法允许我读取流的 ASCII 行,无缓冲,然后一次读取流的其余部分的单个字节。您可能需要进行一些调整以满足您的需求。

class UnbufferedStreamReader: TextReader
{
Stream s;

public UnbufferedStreamReader(string path)
{
s = new FileStream(path, FileMode.Open);
}

public UnbufferedStreamReader(Stream stream)
{
s = stream;
}

// This method assumes lines end with a line feed.
// You may need to modify this method if your stream
// follows the Windows convention of \r\n or some other
// convention that isn't just \n
public override string ReadLine()
{
List<byte> bytes = new List<byte>();
int current;
while ((current = Read()) != -1 && current != (int)'\n')
{
byte b = (byte)current;
bytes.Add(b);
}
return Encoding.ASCII.GetString(bytes.ToArray());
}

// Read works differently than the `Read()` method of a
// TextReader. It reads the next BYTE rather than the next character
public override int Read()
{
return s.ReadByte();
}

public override void Close()
{
s.Close();
}
protected override void Dispose(bool disposing)
{
s.Dispose();
}

public override int Peek()
{
throw new NotImplementedException();
}

public override int Read(char[] buffer, int index, int count)
{
throw new NotImplementedException();
}

public override int ReadBlock(char[] buffer, int index, int count)
{
throw new NotImplementedException();
}

public override string ReadToEnd()
{
throw new NotImplementedException();
}
}

关于c# - 无缓冲 StreamReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/520722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com