2011-11-04 15 views
16

फ़ाइल करने के लिए मुझे एक बड़ा टेक्स्ट दस्तावेज़ बनाने की आवश्यकता है। मैं दस्तावेज़ बनाने के लिए वर्तमान में StringBuilder का उपयोग करता हूं और फिर File.WriteallText(filename,sb.ToString) पर कॉल करता हूं। दुर्भाग्यवश, अब यह स्मृति अपवादों से बाहर निकलना शुरू कर रहा है।स्ट्रीम स्ट्रिंगबिल्डर

क्या फ़ाइल में StringBuilder स्ट्रीम करने का कोई बेहतर तरीका है या क्या कोई अन्य तकनीक है जिसका उपयोग करना चाहिए?

+1

क्या आप केवल एक स्ट्रिंगबिल्डर में डालने और इसे एक साथ करने के बजाय आपके द्वारा जोड़े गए पाठ के साथ File.WriteAllText नहीं कर सकते हैं? –

+3

@ बाली 'WriteAllText' को कॉल करने के लिए आपको सभी टेक्स्ट की आवश्यकता है, ताकि स्मृति समस्याओं के साथ मदद नहीं मिलेगी –

+0

@MarcGravell Ah हाँ, मेरी गलती, धन्यवाद मार्क –

उत्तर

21

इसके बजाय, TextWriter का उपयोग करके देखें (जो एक मोटे तौर पर समान एपीआई है, लेकिन जो फ़ाइलों सहित, अंतर्निहित स्थलों में से एक नंबर को लिख सकते हैं) - यानी

using(TextWriter writer = File.CreateText(path)) 
{ 
    // loop etc 
    writer.Write(...); 
} 

आम तौर पर, यह अलग करने के लायक है कोड है कि कोड है कि डेटा लिखने के लिए कैसे के बारे में जानता से फाइल के बारे में जानता है, यानी

using(var writer = File.CreateText(path)) 
{ 
    Serialize(writer); 
} 
... 
void Serialize(TextWriter writer) 
{ 
    ... 
} 

इस आसान विभिन्न लक्ष्यों को लिखने के लिए बनाता है। उदाहरण के लिए, आप अब भी इन-स्मृति कर सकते हैं:

var sw = new StringWriter(); 
Serialize(sw); 
string text = sw.ToString(); 

बिंदु जा रहा है: अपने Serialize कोड एक अलग लक्ष्य को समायोजित करने के बदलने की जरूरत नहीं किया। यह सीधे नेटवर्क पर लिख रहा है, या संपीड़न/एन्क्रिप्शन स्ट्रीम के माध्यम से लिख रहा है। बहुत बहुमुखी।

1

स्ट्रीम में सीधे स्ट्रीमिंग क्यों न करें? आप TextWriter का उपयोग कर सकते हैं।

0

आप स्ट्रीमवाइटर का उपयोग कर सकते हैं और फ़ाइल को सीधे लिख सकते हैं। StringBuilder का उपयोग करने का

5

बस एक StreamWriter कि करने के लिए लिखते हैं का प्रयोग कर एक FileStream:

using (StreamWriter writer = new StreamWriter("filename.txt")) { 
    ... 
} 

निश्चित रूप से यह इच्छा का मतलब है कि आप पाठ कि पहले से ही लिखा है, जैसे आप एक StringBuilder में कर सकते हैं परिवर्तित नहीं कर सकता है, लेकिन मुझे लगता है कि आप वैसे भी इसका उपयोग नहीं कर रहे हैं।

+1

डाउनवोट क्यों? यदि आप यह नहीं समझते कि यह क्या है जो आपको लगता है कि गलत है, तो यह उत्तर में सुधार नहीं कर सकता है। – Guffa

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