代码之家  ›  专栏  ›  技术社区  ›  axk

streamreader.readToEnd()返回空字符串

  •  10
  • axk  · 技术社区  · 16 年前

    我有办法

    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文本作为输入,结果应该是此文本的字符串表示。问题是该方法返回空字符串。让我不解的是,当我在调试模式下遍历方法并到达return语句时,结果变量是一个空字符串,但是如果我为decompressed.readToEnd()表达式创建一个手表,它会返回文本。在这一点上,我希望result变量包含文本,并将decompressed.readToEnd()表达式求值为空字符串。(重新计算解压缩的.readToEnd()表达式将按预期返回空字符串)。

    @编辑: 我发现了 以我为例 readToEnd()返回文本 在第二次通话时 在第一次调用和第二次调用后返回空字符串。

    一定是我遗漏了什么。

    3 回复  |  直到 12 年前
        1
  •  26
  •   Dennis    15 年前

    我认为你的问题是指针在蒸汽中的位置。每次你表演完 ReadToEnd ,指针设置为结束,这就是为什么您可以第一次观看它。

    在之前运行以下代码 读取端 设置指向开头的指针。 someStream.Seek(0, SeekOrigin.Begin)

        2
  •  1
  •   VolkerK    16 年前

    “我一定是少了什么东西。”—也许吧,我也是;—)
    让我们从一个独立的示例开始,看看它与实际代码的不同之处。

    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.

        3
  •  1
  •   lost_in_the_source    12 年前

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

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

    那就叫它,而不是叫 ReadToEnd() . 我测试了一下,结果成功了。

    推荐文章