Dot-Net

StreamReader.ReadToEnd() 返回一個空字元串

  • May 9, 2014

我有一個方法

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 文本作為輸入,結果應該是該文本的字元串表示形式。問題是該方法返回一個空字元串。令我困惑的是,當我在調試模式下通過該方法並到達返回語句時,結果變數是一個空字元串,但是如果我為 decompressed.ReadToEnd() 表達式創建一個監視,它會返回文本。我現在期望的是包含文本的結果變數和評估為空字元串的 decompressed.ReadToEnd() 表達式。(重新評估 decompressed.ReadToEnd() 表達式按預期返回一個空字元串)。

**@Edit:**我發現在我的情況下, ReadToEnd() 在第二次呼叫時返回文本,在第一次呼叫和第二次呼叫後返回空字元串。

一定有一些明顯的東西我在這裡失踪了。

我認為您的問題是指針在蒸汽中的位置。每次執行後ReadToEnd,指針都會設置到末尾,這就是您可以第一次觀看的原因。

之前執行以下程式碼ReadToEnd將指針設置為開頭。 someStream.Seek(0, SeekOrigin.Begin)

“一定有什麼明顯的東西我在這裡遺漏了。” - 也許,我也是;-)

讓我們從一個獨立的小例子開始,看看它與您的實際程式碼有什麼不同。

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.

引用自:https://stackoverflow.com/questions/2572963