मुझे लगता है मैं एक 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
पर एक मान्य विकल्प नहीं है यही कारण है कि एक साथ लाता है। बड़े प्रदर्शन की सजा (वहाँ एक synchronized
StreamEncoder
में शामिल ब्लॉक है)
नोट 2:। मैं समझता हूँ कि यह आदेश किराए की कोख की गणना करने में पुल पर एक छोटे से चार अतिप्रवाह रखने के लिए आवश्यक हो सकता है ऐसा नहीं है कि मैं करने की जरूरत नहीं है। निष्पादन को रोको स्रोत प्रणाली के आयन बहुत ही पल में यह एन-वें बाइट उत्पन्न करता है (यह संभव नहीं होगा कि बाइट्स byte[]
के रूप में write
कॉल में मेरे पास आ सकें)। लेकिन मुझे इसे एएसएपी को रोकने की ज़रूरत है, और 8K, 2K या 200-बाइट बफर फ्लश करने के लिए प्रतीक्षा करना बहुत देर हो जाएगा।
यकीनन यह * नहीं कर सकते हैं * पूरी तरह से हो सकता है unbuffered - अगर आप सरोगेट जोड़ी के पहले छमाही के साथ 'लिखना' कहते हैं, तो ज्यादातर एन्कोडिंग के लिए लेखक को * स्टोर करना होगा और कुछ भी लिखने से पहले दूसरे चरित्र की प्रतीक्षा करनी होगी। –
ठीक है हाँ, ज़ाहिर है, मैं इसे समझता हूं। लेकिन सरोगेट जोड़ी और 8 के बफर की गणना करने के लिए आवश्यक कुछ बफर्ड वर्णों के बीच एक अंतर है ... –
मुझे नहीं लगता कि वहां कोई भी "बिल्कुल" है - मुझे संदेह है कि कई पाठक मान लेंगे कि आपको कोई बफरिंग नहीं है, और यह कि आप सरोगेट जोड़े से अवगत नहीं हो सकते हैं। मेरा सुझाव है कि आप इसे स्पष्ट करने के लिए प्रश्न संपादित करें। (क्या यह "बहुत देर हो चुकी" होगी यदि 'लिखने' के लिए पहली कॉल निष्पादन को रोक नहीं पाती है, उदाहरण के लिए?) –