Czy istnieje sposób, aby StreamReader nie buforował?Niepobudzony StreamReader
Próbuję obsłużyć dane wyjściowe z procesu, który może być binarny lub tekstowy. Dane wyjściowe będą wyglądały jak odpowiedź HTTP, np.
Content-type: application/whatever
Another-header: value
text or binary data here
Co chcę zrobić jest do analizowania nagłówków używając StreamReader
, a następnie albo czytać z jego BaseStream
lub StreamReader
obsłużyć resztę zawartości. Oto w zasadzie to, co zacząłem:
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());
}
To wydaje się wyrzucać dane binarne. Więc zmieniłem ostatni wiersz do czegoś takiego:
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());
}
... ale StreamReader buforuje dane wejściowe, więc reader.BaseStream znajduje się w niewłaściwej pozycji. Czy istnieje sposób na zdekoncentrowanie StreamReadera? Czy mogę powiedzieć StreamReader, aby zresetować strumień z powrotem do miejsca, w którym znajduje się StreamReader?
Matt - możesz rozwinąć na "StreamReader czyta bloki na raz, więc czytelnik.BaseStream jest w złym położeniu." – jro
mam nadzieję, że to będzie bardziej przejrzyste. –