2010-04-03 114 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()。我測試了它,它工作。