2013-03-04 9 views
5

मेरे पास एक सॉकेट है जिसमें मैं कुछ चरित्र डेटा लिखता हूं, और कुछ कच्चे बाइट डेटा। चरित्र डेटा के लिए, PrintWriter का उपयोग करना आसान है। कच्चे बाइट डेटा के लिए, सीधे OutputStream पर लिखना आसान है। तो मेरी कोड भर, मैं खंडों इस तरह है: जब तक मैं किसी अन्य तरीके से स्ट्रीम में लिखें के लिए शुरुआत के बाद इस Writer लिखने के लिए नहीं सावधान कर रहा हूँक्या अंतर्निहित धारा को बंद किए बिना लेखक को बंद करने का कोई तरीका है?

Writer writer = new PrintWriter(outputStream); 
writer.write(someText); 
... 
writer.flush(); 
// No call to writer.close(), because that would close the underlying stream. 

, इस ठीक है। लेकिन अगर मैं गलती से धारा में लिखता हूं तो मुझे यह जानने की सुरक्षा पसंद आएगी कि मुझे IOException मिलेगा (जैसा कि मैंने इसे बंद कर दिया था)।

क्या इसके अंतर्निहित धारा को बंद किए बिना भविष्य में Writer पर स्पष्ट रूप से लिखने का कोई तरीका है?

उत्तर

7

बस शब्दों में कहें, नहीं। जिस तरह से जावा आईओ स्ट्रीम कक्षाएं लिखी जाती हैं, वे हमेशा करीबी परिचालनों को चेन करते हैं। आप निश्चित रूप से, अपने स्वयं के लेखक कार्यान्वयन को बना सकते हैं जो इस व्यवहार को ओवरराइड करता है।

9

क्यों? close() केवल दो चीजें करता है: (1) लेखक को फ्लश करें और (2) नेस्टेड लेखक पर close() पर कॉल करें। यदि आप नहीं चाहते हैं (2), तो flush() पर कॉल करें और close() पर कॉल न करें।

0

मैं एक विशेष वर्ग दोनों पात्रों और बाइनरी डेटा, की तरह कुछ लिखने के लिए अनुमति देता है पैदा करेगा:

class CombinedWriter extends Writer { 
    private boolean isWritingBinary; 
    private Writer mWriter; 
    private OutputStream mOutputStream; 
    public void write(byte[] bytes) { 
     // flush the writer if necessary 
     isWritingBinary = true; 
     mOutputStream.write(bytes); 
    } 
    public void write(String string) { 
     // flush if necessary 
     isWritingBinary = false; 
     mWriter.write(string); 
    } 
    public void flush() { 
     // ... 
    } 
    public void close() { 
     // ... 
    } 
} 

यह बढ़ाने या नहीं का विस्तार Writer सकता है; बाद के मामले में, आपको अपने कोड में उपयोग की जाने वाली विधियों को ओवरराइड करने की आवश्यकता नहीं है।

लेखक फ्लश के साथ चाल अभी भी वहां है, लेकिन यह एक वर्ग में स्थानीयकृत है; इसके अलावा, यदि कुछ भविष्य के संस्करण में चाल टूट जाती है, तो कक्षा को चाल को खत्म करने के लिए फिर से लिखा जा सकता है (एक को एंड्रॉइड स्रोतों से कोड का एक हिस्सा उधार लेने की आवश्यकता होगी)।

0

यह दोनों चरित्र और बाइनरी डेटा के लिए OutputStream उपयोग करने के लिए कैसे:

byte strBin[] = someText.getBytes("UTF-8"); 
outputStream.write(strBin); 

बदलें "UTF-8" यदि आप एक different एन्कोडिंग चाहते हैं।

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

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