2013-08-29 2 views
6

मैं निर्दिष्ट चार्टसेट का उपयोग करके आउटपुटस्ट्रीम में एक CharSequence लिखना चाहता हूं। असल में एक ही CharSet के साथ शुरू किया गया एक राइटर क्या करेगा, जब लिखना (स्ट्रिंग) कहा जाता है।एक CharSet (बिना स्ट्रिंग में कनवर्ट किए) का उपयोग करके CharSequence को एन्कोड करने के लिए कैसे करें

पकड़ है, कई CharSequences लिखे जाने हैं और कुछ बहुत बड़े हैं। मामलों को जटिल बनाने के लिए और अधिक कुछ आउटपुटस्ट्रीम के लिए लिखा जा सकता है। मैं आसानी से लागू कर सकते हैं कि का उपयोग करके (वास्तव में मैं वर्तमान में इसे उस तरह से लागू कर दिया है):

byte[] rawBytes = CharSequence.toString().getBytes(CharSet) 
for (OutputStream out : outputTargets) { 
    out.write(rawBytes); 
} 

लेकिन स्पष्ट रूप से स्ट्रिंग एक पूरी तरह से अवांछित कचरा वस्तु यहाँ है, के रूप में बाइट [] सरणी है। मैं एक ऐसी विधि की तलाश में हूं जो मुझे इंटरमीडिएट ऑब्जेक्ट्स के बिना सीधे एन्कोडिंग करने की अनुमति देता है। आश्चर्य की बात यह असंभव प्रतीत होती है - हर जगह मैंने जेआरई में देखा जहां एक CharSequence स्वीकार किया जाता है, यह किसी भी काम से पहले इसे स्ट्रिंग में जल्दी से परिवर्तित कर देता है।

चार्टसेट के लिए रूपांतरण कार्य का अधिकांश (सभी?) गैर-सार्वजनिक वर्गों में किया जाता है, इसलिए मुझे किसी भी पारदर्शी और कानूनी तरीके से इसका उपयोग करने का कोई तरीका नहीं मिला है।

कचरा कैसे बचाया जा सकता है/जेआरई की चारसेट एन्कोडिंग सुविधाओं का सीधे उपयोग किया जा सकता है?

+0

देखें CharsetEncoder – ZhongYu

उत्तर

6

अनुक्रम के पात्रों पर Iterate और उन्हें एक लेखक को लिखें।

OutputStream outputStream = .... 
CharSequence charSequence = .... 
Charset charset = .... 

Writer writer = new OutputStreamWriter(outputStream, charset); 

for (int i = 0; i < charSequence.length(); i++) { 
    writer.write(charSequence.charAt(i)); 
} 
+0

मैं ऐसा करने में अनिच्छुक था (क्योंकि मुझे कुछ डिज़ाइन परिवर्तन करने की आवश्यकता है), लेकिन कुछ विचारों के बाद यह एक सरल, फिर भी प्रभावी रूप से प्रभावी तरीका प्रतीत होता है (यदि कोई आउटपुटस्ट्रीम की देखभाल करता है buffered हो)। – Durandal

5

आप Charset उपयोग कर सकते हैं एक बाइट सरणी के लिए एक CharSequence एन्कोड करने के लिए:,

private static byte[] encodeUtf8(CharSequence cs) { 
    ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(cs)); 
    byte[] result = new byte[bb.remaining()]; 
    bb.get(result); 
    return result; 
} 

तो OutputStream के बजाय, आप WritableByteChannel का एक उदाहरण का उपयोग कर रहे है, इसकी write विधि ByteBuffer सीधे लगता है, इसलिए आपको बाइट बफर को पहले बाइट सरणी में कॉपी करने की भी आवश्यकता नहीं है।

+1

मेरा मानना ​​है कि ओपी पूरे अनुक्रम के लिए एक इन-मेमोरी बाइट सरणी बनाने से बचना चाहता है। कल्पना करें कि CharSequence उपलब्ध RAM से 10 गुना बड़ा है। उस मामले में यह विधि काम नहीं करेगी, है ना? – Keith

+1

यह एक उचित बिंदु है, और आपके समाधान (+1) के लिए एक अच्छा उपयोग केस है। –

+0

वैसे मेरी CharSequences आमतौर पर सभी बड़े नहीं होते हैं (कुछ के, लेकिन वे अक्सर होते हैं और यह बहुत अधिक कचरा उत्पन्न करता है)। लंबाई() विधि को एक int लौटने की वजह से हार्ड कैप भी है, जिससे किसी को एक बड़े टेक्स्टफाइल को CharSequence के रूप में प्रदर्शित करने से रोकता है। CharBuffer.wrap() के साथ विचार, जबकि मैं इस विशेष समस्या के लिए इसका उपयोग नहीं करूँगा अन्य स्थितियों में सहायक हो सकता है। – Durandal

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

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