StreamReader.ReadToEnd (), возвращающий пустую строку - PullRequest
10 голосов
/ 04 апреля 2010

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

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 текст в качестве ввода, и результат должен быть строковым представлением этого текста. Проблема в том, что метод возвращает пустую строку. Что меня озадачивает, так это то, что когда я выполняю метод в режиме отладки и достигаю оператора return, переменная результата становится пустой строкой, но если я создаю часы для выражения decompressed.ReadToEnd (), он возвращает мне текст. На данный момент я ожидаю, что переменная результата будет содержать текст и выражение decompressed.ReadToEnd (), оцениваемое в пустую строку. (Повторная оценка выражения decompressed.ReadToEnd () возвращает пустую строку, как и ожидалось).

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

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

Ответы [ 3 ]

26 голосов
/ 09 августа 2010

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

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

1 голос
/ 04 апреля 2010

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

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;
  }
}

отпечатков Mary had a little lamb.

0 голосов
/ 17 апреля 2014

Создайте свою собственную функцию. Он будет принимать путь в качестве параметра:

    static string read(string path)
    {
        StreamReader sr = new StreamReader(@path); 
        string txt = "";
        while (!sr.EndOfStream) {
            txt += sr.ReadLine() + "\n";
        }
        sr.Close();
        return txt;
    }

Тогда звоните вместо ReadToEnd(). Я проверил это, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...