2010-04-03 160 views
8

我有一个方法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的()返回第二呼叫第一呼叫和第二呼叫后返回空字符串文本

必须有一些明显的我在这里失踪。

+0

编码实际上是UTF8吗? – 2010-04-03 23:01:42

+0

是的,它是UTF8。 – axk 2010-04-03 23:05:27

回答

21

我觉得你的问题是在蒸汽中的指针的位置。每次执行ReadToEnd后,指针都会设置为结束,这就是为什么您可以第一次看它。

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

+0

这为我解决了问题 – Aaronontheweb 2011-03-29 07:50:48

+0

streamReader没有Seek成员函数 – stackptr 2014-04-17 14:56:22

+0

@stackptr you需要在提供给StreamReader的流中使用它 – 2017-09-13 12:44:00

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.

+0

感谢您的帮助!你的例子工作。在我的情况唯一的区别是我从SQL数据库获取数据与SqlDataReader和文本是相当长一点,并有一些非ASCII字符。我发现在我的案例_ ReadToEnd返回第二个电话的文本。 – axk 2010-04-04 08:17:22

+0

这是否只发生在较长的数据或您可以减少数据量(传递给DecompressAndDecode(byte [])以进行调试? – VolkerK 2010-04-05 09:32:58

1

创建您自己的自定义函数。它会采取的路径作为参数:

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

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