2010-04-03 18 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; 
} 

मैं इनपुट के रूप में कुछ GZipped पाठ है और परिणाम यह पाठ का एक स्ट्रिंग प्रतिनिधित्व माना जाता है की है। समस्या यह है कि विधि एक खाली स्ट्रिंग देता है। मुझे परेशान करने वाला यह है कि जब मैं डीबग मोड में विधि को गहराई से चलाता हूं और रिटर्न स्टेटमेंट तक पहुंच जाता हूं तो परिणाम चर एक खाली स्ट्रिंग है, लेकिन अगर मैं डिकंप्रेस्ड के लिए घड़ी बना देता हूं। ReadToEnd() अभिव्यक्ति यह मुझे टेक्स्ट देता है। इस बिंदु पर मैं अपेक्षा करता हूं कि परिणाम चर है जिसमें पाठ और डिकंप्रेस्ड किया गया है। रिक्त ट्रॉन्ड() अभिव्यक्ति एक खाली स्ट्रिंग का मूल्यांकन करती है। (Decompressed का पुनर्मूल्यांकन। ReadToEnd() अभिव्यक्ति अपेक्षित के रूप में एक खाली स्ट्रिंग देता है)।

@Edit: मैंने पाया कि मेरे मामले ReadToEnd() में पाठ दूसरी कॉल पहली कॉल पर और दूसरा कॉल के बाद रिक्त स्ट्रिंग लौटने पर रिटर्न दिया है।

कुछ स्पष्ट होना चाहिए जो मैं यहां याद कर रहा हूं।

+0

वास्तव में एन्कोडिंग एटीएफ 8 है? –

+0

हां, यह यूटीएफ 8 है। – axk

उत्तर

21

मुझे लगता है कि आपकी समस्या को भाप में सूचक की स्थिति है। ReadToEnd करने के बाद प्रत्येक बार, सूचक अंत तक सेट होता है, यही कारण है कि आप इसे पहली बार देख सकते हैं।

शुरुआत में पॉइंटर सेट करने के लिए ReadToEnd से पहले निम्न कोड चलाएं। someStream.Seek(0, SeekOrigin.Begin)

+0

इसने मेरे लिए समस्या हल की – Aaronontheweb

+0

स्ट्रीम रीडर के लिए कोई खोज सदस्य फ़ंक्शन नहीं है। – stackptr

+0

@stackptr स्ट्रीम को उस स्ट्रीम पर इस्तेमाल करने की आवश्यकता है जिसे आप अपने स्ट्रीम रीडर को खिलाते हैं –

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 डेटाबेस से SQL सर्वर से डेटा प्राप्त हो रहा है और पाठ काफी लंबा है और इसमें कुछ गैर-असीसी वर्ण हैं। मैंने पाया है कि _in my case_ ReadToEnd दूसरे कॉल पर पाठ देता है। – axk

+0

क्या यह केवल लंबे डेटा के साथ होता है या क्या आप डीबगिंग उद्देश्यों के लिए डेटा की मात्रा को कम कर सकते हैं (DecompressAndDecode (बाइट []) को पास कर सकते हैं? – VolkerK

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() करने के लिए कॉल करने के बजाय यह कहते हैं। मैंने इसका परीक्षण किया, और यह काम किया।

संबंधित मुद्दे