एक स्ट्रिंग में एक OutputStream जाओ


580

जावा में एक स्ट्रिंग से java.io.OutputStream से आउटपुट पाइप करने का सबसे अच्छा तरीका क्या है?

कहो मेरे पास विधि है:

  writeToStream(Object o, OutputStream out)

जो दिए गए स्ट्रीम में ऑब्जेक्ट से कुछ डेटा लिखता है। हालाँकि, मैं चाहता हूं कि इस आउटपुट को एक स्ट्रिंग में आसानी से प्राप्त किया जा सके।

मैं इस तरह एक वर्ग लिखने पर विचार कर रहा हूं (अप्राप्त):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

लेकिन क्या कोई बेहतर तरीका है? मैं केवल एक परीक्षण चलाना चाहता हूं!


6
क्या आपके पास केवल ASCII बाइट्स हैं? क्या आपको कोई कोडपेज की आवश्यकता है?
होरक्रूक्स

इस मामले में, हाँ। हालाँकि, अच्छी बात - मैंने इसके बारे में नहीं सोचा था।
एड्रियन मौट

जवाबों:


607

मैं एक का उपयोग करेंगे ByteArrayOutputStream। और खत्म होने पर आप कॉल कर सकते हैं:

new String( baos.toByteArray(), codepage );

या और अच्छा:

baos.toString( codepage );

के लिए Stringनिर्माता, codepageएक हो सकता है Stringया का एक उदाहरण java.nio.charset.Charset । एक संभावित मान java.nio.charset.StandardCharsets.UTF_8 है

विधि toString()केवल एक पैरामीटर (जावा 8 को खड़ा करें) के Stringरूप में स्वीकार करती है codepage


8
ByteArrayOutputStream की कोई विधि नहीं है () विधि; हालांकि यह BBteteArray () है। क्या आप जवाब ठीक कर सकते हैं? इसके अलावा, क्यों baos.toString (स्ट्रिंग charsetName) का उपयोग न करें जो थोड़ा सरल होगा।
जोनिक

35
एक बायट्रेयर केवल बाइनरी डेटा है। के रूप में (यूनिकोड) पाठ को कई अलग-अलग तरीकों से बाइनरी एन्कोड किया जा सकता है, बाइटएयरएयरऑप्टपुटस्ट्रीम को यह जानना होगा कि बाइट्स को एन्कोड करने के लिए एन्कोडिंग का क्या उपयोग किया गया था, इसलिए यह फिर से स्ट्रिंग को बाइट्स को डीकोड करने के लिए उसी एन्कोडिंग का उपयोग कर सकता है। किसी तर्क के बिना केवल स्ट्रिंग का उपयोग करना बुद्धिमानी नहीं है क्योंकि आप समस्या से निपटने के बजाय उसे अनदेखा करते हैं; जावा प्लेटफ़ॉर्म एन्कोडिंग का उपयोग करेगा जो सही हो सकता है ... या नहीं। यह मूल रूप से यादृच्छिक है। आपको यह पता लगाने की आवश्यकता है कि टेक्स्ट को बाइट्स में लिखने और उस एन्कोडिंग को स्ट्रिंग में पास करने के लिए किस एन्कोडिंग का उपयोग किया गया था।
Stijn de Witt

10
यहाँ संदर्भित कोडपेज पर सिर्फ एक स्पष्टीकरण: जावा में आप चारसेट.डफॉल्टचार्सेट () या चारसेट.फोरनाम ("विशिष्ट चारसेट") का उपयोग कर सकते हैं; मेरे लिए जो काम किया गया वह था: नया स्ट्रिंग (baos.toByteArray) (, चारसेट.डेफॉल्टक्रैसेट ());
वालेस ब्राउन

7
@WallaceBrown का उपयोग defaultCharsetचारसेट को पूरी तरह से नजरअंदाज करने से बेहतर नहीं है - आपको यह जानने की जरूरत है कि आपके उपयोग करने से पहले यह क्या हैtoString
आर्टिफिशियल

4
StandardCharsets.UTF_8a Charset, a नहीं है String। इसके अलावा पैरामीटर कहा जाता है charsetName, नहीं codepage
ऑरेंजडॉग

46

मुझे अपाचे कॉमन्स आईओ लाइब्रेरी पसंद है। इसके संस्करण ByteArrayOutputStream पर एक नज़र डालें , जिसमें एक toString(String enc)विधि भी है toByteArray()। कॉमन्स परियोजना जैसे मौजूदा और विश्वसनीय घटकों का उपयोग करने से आपका कोड छोटा और विस्तारित और पुन: प्रस्तुत करने में आसान हो जाता है।


10
अपने आप को अपने जीवन का एक वर्ष बचाएं और सभी आम एपीआई के माध्यम से पढ़ें ताकि जब आप किसी समस्या का सामना करें, तो आप पूरी तरह से परीक्षण किए गए और समुदाय के स्वामित्व वाले समाधान को प्राप्त कर सकें।
बॉब हेरमैन

15
हम्म, मैं एक शौकीन चावला Apache Commons उपयोगकर्ता हूं, लेकिन इस मामले में मैं यह देखने में विफल हूं कि आपको JDK के अपने java.io.ByteArrayOutputStream के बजाए Commons IO के ByteArrayOutputStream का उपयोग क्यों करना चाहिए। उत्तरार्द्ध भी प्रदान करता है (स्ट्रिंग charsetName) स्ट्रिंग औरByteArray () तरीके। विस्तृत करने के लिए परवाह?
जोनीक

1
हां, चूंकि मूल संदर्भ सामग्री को स्ट्रीम और एक्स्ट्रेक्ट करने का एक बेहतर तरीका था, इसलिए मैंने कॉमन्स IO उदाहरण को शामिल किया क्योंकि इसमें आउटपुटस्ट्रीम को पॉप्युलेट करने के लिए एक अपरिभाषित / संदिग्ध तंत्र के लिए एक 'राइट (इनपुटस्ट्रीम)' विधि शामिल थी। मैं JDK के साथ भी जाऊंगा।
जो लीवरेज

23

यह अच्छी तरह से काम किया

OutputStream output = new OutputStream() {
    private StringBuilder string = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        this.string.append((char) b );
    }

    //Netbeans IDE automatically overrides this toString()
    public String toString() {
        return this.string.toString();
    }
};

विधि कॉल = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

फिर स्ट्रिंग को प्रिंट करने के लिए या इसे केवल "आउटपुट" स्ट्रीम को संदर्भित करने के लिए प्राप्त करें उदाहरण के लिए, स्ट्रिंग को कंसोल => से प्रिंट करने के लिए System.out.println(output);

FYI करें: मेरा तरीका कॉल marshaller.marshal(Object,Outputstream)XML के साथ काम करने के लिए है। यह इस विषय के लिए अप्रासंगिक है।

यह उत्पादक उपयोग के लिए अत्यधिक बेकार है, एक तरीका बहुत अधिक रूपांतरण है और यह थोड़ा ढीला है। यह आपको केवल यह साबित करने के लिए कोडित किया गया था कि कस्टम OuputStream बनाना और स्ट्रिंग को आउटपुट करना पूरी तरह से संभव है। लेकिन सिर्फ होरक्रूक्स 7 रास्ते पर जाएं और केवल दो विधि कॉलों के साथ सब अच्छा है।

और दुनिया एक और दिन रहती है ...।


9
बस एक बाइट को चार करने के लिए केवल एससीआई पर काम करना होगा। ByteArrayOutputStream का उपयोग करें जैसे Horcrux7
डेव रे

2
डेव रे के साथ सहमत। आप यह नहीं मान सकते कि आपका बाइट एक ASCII वर्ण है। आपको एन्कोडिंग का उपयोग करके बाइट्स की व्याख्या करने की आवश्यकता है। ByteArrayOutputStream.toString ("UTF-8") या नए स्ट्रिंग (byteArrayOutputStream.toByteArray (), "UTF-8") का उपयोग करें।
मार्टिन डॉव

16

यहाँ मैं क्या कर रहा हूँ समाप्त:

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

जहां ओएस एक है ByteArrayOutputStream


2
@JavaJigs मैंने लगभग 5 साल पहले अपने जवाब के निचले भाग पर इसे स्पष्ट किया था :)
एड्रियन मौट

19
"UTF-8"साथ बदलने पर विचार करें StandardCharsets.UTF_8
james.garriss

0
baos.toString(StandardCharsets.UTF_8);

नामित वर्णक का उपयोग करके बाइट्स को डिकोड करके बफ़र की सामग्री को एक स्ट्रिंग में परिवर्तित करता है।

जावा 14 - https://docs.oracle.com/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.