StreamReader.ReadToEnd()返回一个空字符串

时间:2010-04-03 22:59:47

标签: .net stream

我有一个方法

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

我有一些GZip文本作为输入,结果应该是这个文本的String表示。问题是该方法返回一个空字符串。让我感到困惑的是,当我在调试模式中执行该方法并到达return语句时,结果变量是一个空字符串但是如果我为decompressed.ReadToEnd()表达式创建一个监视器,它会返回文本。在这一点上我期望的是包含文本的结果变量和评估为空字符串的decompressed.ReadToEnd()表达式。 (重新评估decompressed.ReadToEnd()表达式会按预期返回一个空字符串。)

@Edit:我发现在我的情况下 ReadToEnd()会在第二次调用上返回文本,在第一次调用时返回空字符串打电话和第二次电话之后。

这里肯定有一些显而易见的东西。

3 个答案:

答案 0 :(得分:26)

我认为你的问题是指针在蒸汽中的位置。每次执行ReadToEnd后,指针都会设置为结束,这就是您第一次观看它的原因。

ReadToEnd之前运行以下代码,将指针设置为开头。 someStream.Seek(0, SeekOrigin.Begin)

答案 1 :(得分:1)

“这里肯定有一些显而易见的东西。” - 也许,我也是;-)
让我们从一个小的自包含示例开始,看看它与实际代码的不同之处。

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.

答案 2 :(得分:0)

创建自己的自定义功能。它将路径作为参数:

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

然后调用它而不是调用ReadToEnd()。我测试了它,它起作用了。