StreamReader. ReadToEnd () возврат пустой строки

У меня есть метод

private static String DecompressAndDecode(byte[] data)
{
   GZipStream decompressor = new GZipStream(new MemoryStream(data), CompressionMode.Decompress);
   StreamReader decompressed = new StreamReader(decompressor, Encoding.UTF8);
   String result = decompressed.ReadToEnd();
   return result;
}

У меня есть некоторый текст GZipped, как введено, и результатом, как предполагается, является Строковое представление этого текста. Проблема состоит в том, что метод возвращает пустую строку. То, что является озадачивающим меня, - то, что, когда я ступаю канавка метод в режим отладки и достигаю оператора возврата, переменная результата является пустой строкой, но если я создаю часы для распакованного. ReadToEnd () выражение это возвращает меня текст. То, что я ожидал бы в этой точке, является переменной результата для содержания текста и распакованного. ReadToEnd () оценка выражения к пустой строке. (Переоценка распакованного. ReadToEnd () выражение возвращает пустую строку как ожидалось).

@Edit: Я нашел, что в моем случае ReadToEnd () возвращает текст на втором вызове, возвращая пустые строки на первом вызове и после второго вызова.

Должно быть что-то очевидное, которое я пропускаю здесь.

10
задан axk 4 April 2010 в 08:23
поделиться

2 ответа

Я думаю, что ваша проблема заключается в положении указателя в паре. Каждый раз, когда вы выполняете ReadToEnd, указатель устанавливается в конец, вот почему вы можете смотреть его в первый раз.

Выполните следующий код перед ReadToEnd, чтобы установить указатель на начало. someStream.Seek(0, SeekOrigin.Begin)

26
ответ дан 3 December 2019 в 15:51
поделиться

"Должно быть, есть что-то очевидное, что я упускаю." - возможно, и я тоже ;-)
. Давайте начнем с небольшого самодостаточного примера и посмотрим, чем он отличается от вашего реального кода.

class SOTest
{
  private static String DecompressAndDecode(byte[] data)
  {
    GZipStream decompressor = new GZipStream(new MemoryStream(data), CompressionMode.Decompress);
    StreamReader decompressed = new StreamReader(decompressor, Encoding.UTF8);
    String result = decompressed.ReadToEnd();
    return result;
  }

  private static byte[] foo(string data)
  {
    MemoryStream dest = new MemoryStream();
    using (GZipStream compressor = new GZipStream(dest, CompressionMode.Compress))
    {
      using (StreamWriter sw = new StreamWriter(compressor))
      {
        sw.Write(data);
      }
    }
    return dest.GetBuffer();
  }


  static void Main()
  {
    System.Console.WriteLine(
      DecompressAndDecode(foo("Mary had a little lamb."))
    );
    return;
  }
}

printsУ Марии был маленький ягненок.

1
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: