Dot-Net
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; }我有一些 GZipped 文本作為輸入,結果應該是該文本的字元串表示形式。問題是該方法返回一個空字元串。令我困惑的是,當我在調試模式下通過該方法並到達返回語句時,結果變數是一個空字元串,但是如果我為 decompressed.ReadToEnd() 表達式創建一個監視,它會返回文本。我現在期望的是包含文本的結果變數和評估為空字元串的 decompressed.ReadToEnd() 表達式。(重新評估 decompressed.ReadToEnd() 表達式按預期返回一個空字元串)。
**@Edit:**我發現在我的情況下, ReadToEnd() 在第二次呼叫時返回文本,在第一次呼叫和第二次呼叫後返回空字元串。
一定有一些明顯的東西我在這裡失踪了。
我認為您的問題是指針在蒸汽中的位置。每次執行後
ReadToEnd,指針都會設置到末尾,這就是您可以第一次觀看的原因。之前執行以下程式碼
ReadToEnd將指針設置為開頭。someStream.Seek(0, SeekOrigin.Begin)
“一定有什麼明顯的東西我在這裡遺漏了。” - 也許,我也是;-)
讓我們從一個獨立的小例子開始,看看它與您的實際程式碼有什麼不同。
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.