我有一个方法
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()会在第二次调用上返回文本,在第一次调用时返回空字符串打电话和第二次电话之后。
这里肯定有一些显而易见的东西。
答案 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()
。我测试了它,它起作用了。