2010-12-16 12 views
13

पर खाली स्ट्रिंग देता है मुझे पता है कि इस सवाल को स्टैक ओवरफ्लो से पहले पूछा गया है, लेकिन स्पष्टीकरण नहीं मिला।StreamReader ReadToEnd() पहले प्रयास

जब मैं एक संपीड़ित बाइट सरणी से स्ट्रिंग को पढ़ने का प्रयास करता हूं तो मुझे पहले प्रयास पर एक खाली स्ट्रिंग मिलती है, दूसरी बार मैंने सफलता प्राप्त की और स्ट्रिंग प्राप्त की।

कोड उदाहरण:

public static string Decompress(byte[] gzBuffer) 
{ 
    if (gzBuffer == null) 
     return null; 
    using (var ms = new MemoryStream(gzBuffer)) 
    { 
     using (var decompress = new GZipStream(ms, CompressionMode.Decompress)) 
     { 
      using (var sr = new StreamReader(decompress, Encoding.UTF8)) 
      { 
       string ret = sr.ReadToEnd(); 
       // this is the extra check that is needed !? 
       if (ret == "") 
        ret = sr.ReadToEnd(); 
       return ret; 
      } 
     } 
    } 
} 

सभी सुझाव की सराहना की कर रहे हैं। - विक्टर Cassel

+0

मुझे नहीं लगता कि आपको चेक की आवश्यकता है, यह अनावश्यक दिखता है। – Nick

उत्तर

1

जोड़ने ms.Position = 0string ret = sr.ReadToEnd(); से पहले

+0

मैंने कोशिश की और यह मदद नहीं करता है, मैंने ms.Seek (0, SeekOrigin.Begin) भी कोशिश की। –

1

The MSDN Page on the function उल्लेख निम्न प्रयास करें:

वर्तमान पद्धति एक OutOfMemoryException फेंकता है, तो अंतर्निहित स्ट्रीम वस्तु में पाठक की स्थिति की संख्या से उन्नत है वर्णों को पढ़ने में सक्षम थे, लेकिन वर्ण पहले से ही आंतरिक रीडलाइन बफर में पढ़े गए वर्णों को त्याग दिया जाता है। यदि आप बफर में डेटा पढ़ने के बाद अंतर्निहित धारा की स्थिति में हेरफेर करते हैं, तो अंतर्निहित धारा की स्थिति आंतरिक बफर की स्थिति से मेल नहीं खाती है। आंतरिक बफर को रीसेट करने के लिए, DiscardBufferedData विधि को कॉल करें; हालांकि, यह विधि प्रदर्शन धीमा करती है और केवल जरूरी होने पर ही बुलाया जाना चाहिए।

शायद आपके ReadToEnd() से पहले DiscardBufferedData() से कॉल करके और देखें कि यह क्या करता है (मुझे पता है तुम अपवाद नहीं मिल रहा है, लेकिन यह सब मैं के बारे में सोच सकते हैं ... है)?

+0

नहीं, DiscarBufferedData() को कॉल करने से कोई मदद नहीं मिली। –

1

मुझे उम्मीद है कि इससे मदद मिलती है।

bytearray के लिए:

static byte[] CompressToByte(string data) 
{ 
    MemoryStream outstream = new MemoryStream(); 
    GZipStream compressionStream = 
    new GZipStream(outstream, CompressionMode.Compress, true); 
    StreamWriter writer = new StreamWriter(compressionStream); 
    writer.Write(data); 
    writer.Close(); 
    return StreamToByte(outstream); 
} 

static string Decompress(byte[] data) 
{ 
    MemoryStream instream = new MemoryStream(data); 
    GZipStream compressionStream = 
    new GZipStream(instream, CompressionMode.Decompress); 
    StreamReader reader = new StreamReader(compressionStream); 
    string outtext = reader.ReadToEnd(); 
    reader.Close(); 
    return outtext; 
} 

public static byte[] StreamToByte(Stream stream) 
{ 
    stream.Position = 0; 
    byte[] buffer = new byte[128]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     while (true) 
     { 
      int read = stream.Read(buffer, 0, buffer.Length); 
      if (!(read > 0)) 
       return ms.ToArray(); 
      ms.Write(buffer, 0, read); 
     } 
    } 
}

आप if(read <= 0) साथ if(!(read > 0)) बदल सकते हैं। किसी कारण से if(read <= 0) ऊपर corret प्रदर्शित नहीं किया गया है।

स्ट्रीम के लिए:

static Stream CompressToStream(string data) 
{ 
    MemoryStream outstream = new MemoryStream(); 
    GZipStream compressionStream = 
    new GZipStream(outstream, CompressionMode.Compress, true); 
    StreamWriter writer = new StreamWriter(compressionStream); 
    writer.Write(data); 
    writer.Close(); 
    return outstream; 
} 

static string Decompress(Stream data) 
{ 
    data.Position = 0; 
    GZipStream compressionStream = 
    new GZipStream(data, CompressionMode.Decompress); 
    StreamReader reader = new StreamReader(compressionStream); 
    string outtext = reader.ReadToEnd(); 
    reader.Close(); 
    return outtext; 
}
2

कहाँ gzBuffer से आ रही है? क्या आपने संकुचित डेटा का उत्पादन करने वाला कोड भी लिखा था?

शायद आपके पास बफर डेटा अमान्य है या किसी भी तरह अधूरा है, या शायद इसमें एक साथ कई अलग-अलग डिफ्लेट स्ट्रीम शामिल हैं।

+0

मुझे बग मिला। जैसा कि माइकल संपीड़न दिनचर्या में सुझाव दिया गया था। मैं GZipStream पर बंद() को कॉल करने के लिए चूक गया। संपीड़न। (कच्चे, 0, कच्चे। लम्बाई); संपीड़न। बंद(); वापसी ms.ToArray(); क्या हुआ था कि डेटा खराब स्थिति में सहेजा गया था जिसके लिए उसी डेटा को निकालने के लिए बाद में डिकंप्रेशन रूटीन में ReadToEnd() को दो कॉल की आवश्यकता थी। बहुत अजीब! –

3

मुझे बग मिला। जैसा कि माइकल संपीड़न दिनचर्या में सुझाव दिया गया था। मैं GZipStream पर बंद() को कॉल करने के लिए चूक गया।

public static byte[] Compress(string text) 
{ 
    if (string.IsNullOrEmpty(text)) 
     return null; 

    byte[] raw = Encoding.UTF8.GetBytes(text); 
    using (var ms = new MemoryStream()) 
    { 
     using (var compress = new GZipStream (ms, CompressionMode.Compress)) 
     { 
      compress.Write(raw, 0, raw.Length); 
      compress.Close(); 

      return ms.ToArray(); 
     } 
    } 
} 

क्या हुआ है कि डेटा एक बुरी राज्य कि विसंपीड़न दिनचर्या में बाद में एक ही डेटा निकालने के ReadToEnd() के लिए दो कॉल के लिए आवश्यक में बचाया पाने के लिए लग रहा था था। बहुत अजीब!

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