2016-04-23 7 views
6

मुझे लगता है मैं एक java.io.OutputStream करने के लिए एक java.io.Writer इंटरफ़ेस से एक एडाप्टर की जरूरत है, किसी भी मान्य Charset जो मैं एक विन्यास पैरामीटर के रूप में होगा समर्थन byte रों की एक धारा में char की एक धारा बदलने की आवश्यकता है, अर्थात।क्या बफरिंग के बिना आउटपुटस्ट्रीमवाइटर मौजूद है?

हालांकि, java.io.OutputStreamWriter कक्षा में एक गुप्त रहस्य है: sun.nio.cs.StreamEncoder ऑब्जेक्ट के नीचे प्रतिनिधि इसे 8192 बाइट (8 केबी) बफर बनाता है, भले ही आप इसे न पूछें।

समस्या है, OutputStream अंत में मैं एक आवरण है कि, करने की जरूरत है बाइट्स की मात्रा लिखा जा रहा गिनती इतना है कि यह तुरंत स्रोत प्रणाली उत्पादन एक बार बाइट्स की एक विशेष राशि से किया गया है के निष्पादन बंद हो जाता है डाला है। और यदि OutputStreamWriter एक 8 के बफर बना रहा है, तो मुझे बहुत देर से उत्पन्न होने वाली बाइट्स की मात्रा के बारे में अधिसूचित किया जाता है क्योंकि वे केवल फ्लश करते समय केवल मेरे काउंटर तक पहुंचेंगे (इसलिए पहले से ही 8,000 से अधिक जेनरेट किए गए बाइट्स होंगे OutputStreamWriter बफर पर मेरे लिए इंतज़ार कर रहा है)। >OutputStream पुल कि unbuffered चला सकते हैं -

तो सवाल है, वहाँ कहीं भी में जावा रनटाइम एक Writer है?

मैं सच में, सच है नहीं चाहते इस अपने आप को लिखने के लिए: (...

नोट: मार फ्लश() प्रत्येक लिखने के लिए OutputStreamWriter पर एक मान्य विकल्प नहीं है यही कारण है कि एक साथ लाता है। बड़े प्रदर्शन की सजा (वहाँ एक synchronizedStreamEncoder में शामिल ब्लॉक है)

नोट 2:। मैं समझता हूँ कि यह आदेश किराए की कोख की गणना करने में पुल पर एक छोटे से चार अतिप्रवाह रखने के लिए आवश्यक हो सकता है ऐसा नहीं है कि मैं करने की जरूरत नहीं है। निष्पादन को रोको स्रोत प्रणाली के आयन बहुत ही पल में यह एन-वें बाइट उत्पन्न करता है (यह संभव नहीं होगा कि बाइट्स byte[] के रूप में write कॉल में मेरे पास आ सकें)। लेकिन मुझे इसे एएसएपी को रोकने की ज़रूरत है, और 8K, 2K या 200-बाइट बफर फ्लश करने के लिए प्रतीक्षा करना बहुत देर हो जाएगा।

+0

यकीनन यह * नहीं कर सकते हैं * पूरी तरह से हो सकता है unbuffered - अगर आप सरोगेट जोड़ी के पहले छमाही के साथ 'लिखना' कहते हैं, तो ज्यादातर एन्कोडिंग के लिए लेखक को * स्टोर करना होगा और कुछ भी लिखने से पहले दूसरे चरित्र की प्रतीक्षा करनी होगी। –

+0

ठीक है हाँ, ज़ाहिर है, मैं इसे समझता हूं। लेकिन सरोगेट जोड़ी और 8 के बफर की गणना करने के लिए आवश्यक कुछ बफर्ड वर्णों के बीच एक अंतर है ... –

+0

मुझे नहीं लगता कि वहां कोई भी "बिल्कुल" है - मुझे संदेह है कि कई पाठक मान लेंगे कि आपको कोई बफरिंग नहीं है, और यह कि आप सरोगेट जोड़े से अवगत नहीं हो सकते हैं। मेरा सुझाव है कि आप इसे स्पष्ट करने के लिए प्रश्न संपादित करें। (क्या यह "बहुत देर हो चुकी" होगी यदि 'लिखने' के लिए पहली कॉल निष्पादन को रोक नहीं पाती है, उदाहरण के लिए?) –

उत्तर

7

जैसा कि आप पहले से ही StreamEncoderOutputStreamWriter द्वारा उपयोग किए गए हैं, 8KB का बफर आकार है और उस आकार को बदलने के लिए कोई इंटरफ़ेस नहीं है।

लेकिन निम्नलिखित स्निपेट आप एक OutputStream जो आंतरिक रूप से भी एक StreamEncoder का उपयोग करता है, लेकिन अब के लिए एक Writer प्राप्त करने के लिए एक रास्ता देती है उपयोगकर्ता-निर्धारित बफर आकार है:

String charSetName = ... 
CharsetEncoder encoder = Charset.forName(charSetName).newEncoder(); 

OutputStream out = ... 
int bufferSize = ... 

WritableByteChannel channel = Channels.newChannel(out); 
Writer writer = Channels.newWriter(channel, encoder, bufferSize); 
+0

मैं आपको इसके लिए पर्याप्त अंक नहीं दे सकता। यह एक आकर्षण की तरह काम करता है, बहुत बहुत धन्यवाद। केवल एक चीज जिसकी मुझे चिंता है, यह है कि spec परिभाषित करता है कि 'बफर आकार' * न्यूनतम * बफर आकार के रूप में। लेकिन मैं 'sun.nio.cs.StreamEncoder' पर मानक कार्यान्वयन को बस एक निश्चित आकार के रूप में उपयोग करता हूं, इसलिए ऐसा करना चाहिए। एक बार फिर धन्यवाद। –

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