StreamReader.ReadToEnd()返回一个空字符串
我有一个方法StreamReader.ReadToEnd()返回一个空字符串
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压缩的文本作为输入,其结果被认为是这个文本的字符串表示。问题是该方法返回一个空字符串。令我费解的是,当我在调试模式下跳过该方法并到达返回语句时,结果变量是一个空字符串,但如果我为解压缩的.ReadToEnd()表达式创建了一个监视器,它将返回文本。我期望在这一点上是结果变量包含文本和解压缩.ReadToEnd()表达式评估为一个空字符串。 (重新评估decompressed.ReadToEnd()表达式会按预期返回一个空字符串)。
@Edit:我发现在我的情况 ReadToEnd的()返回第二呼叫第一呼叫和第二呼叫后返回空字符串文本。
必须有一些明显的我在这里失踪。
我觉得你的问题是在蒸汽中的指针的位置。每次执行ReadToEnd
后,指针都会设置为结束,这就是为什么您可以第一次看它。
在ReadToEnd
之前运行以下代码将指针设置为开头。 someStream.Seek(0, SeekOrigin.Begin)
这为我解决了问题 – Aaronontheweb 2011-03-29 07:50:48
streamReader没有Seek成员函数 – stackptr 2014-04-17 14:56:22
@stackptr you需要在提供给StreamReader的流中使用它 – 2017-09-13 12:44:00
“这里一定有些东西显而易见。” - 也许,我也是这样;-)
让我们从一个自包含的例子开始,看看它与你的实际代码有什么不同。
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.
创建您自己的自定义函数。它会采取的路径作为参数:
static string read(string path)
{
StreamReader sr = new StreamReader(@path);
string txt = "";
while (!sr.EndOfStream) {
txt += sr.ReadLine() + "\n";
}
sr.Close();
return txt;
}
然后调用它,而不是调用来ReadToEnd()
。我测试了它,它工作。
编码实际上是UTF8吗? – 2010-04-03 23:01:42
是的,它是UTF8。 – axk 2010-04-03 23:05:27