आउटपुट स्ट्रीम पर स्ट्रिंग लिखें


139

मेरे पास कई आउटपुट श्रोता हैं जो आउटपुटस्ट्रीम को लागू कर रहे हैं। यह या तो स्टैडआउट या एक फ़ाइल के लिए एक PrintStream लेखन हो सकता है, या यह मेमोरी या किसी अन्य आउटपुट डेस्टिनेशन पर लिख सकता है; इसलिए, मैंने OutputStream को (a) विधि में तर्क के रूप में निर्दिष्ट किया।

अब, मैं स्ट्रिंग प्राप्त किया है। यहाँ धाराओं को लिखने का सबसे अच्छा तरीका क्या है?

क्या मुझे सिर्फ Writer.write (message.getBytes ()) का उपयोग करना चाहिए? मैं इसे बाइट्स दे सकता हूं, लेकिन अगर डेस्टिनेशन स्ट्रीम एक कैरेक्टर स्ट्रीम है तो क्या यह अपने आप कन्वर्ट हो जाएगी?

क्या मुझे इसके बजाय यहां कुछ पुल धाराओं का उपयोग करने की आवश्यकता है?


2
मुझे यकीन नहीं है, लेकिन यह लगता है जैसे आप यहां पहिया को फिर से मजबूत करने की कोशिश कर रहे हैं, क्या आपने जावा बेस एपीआई, साथ ही कॉमन्स आईओ एपीआई के माध्यम से देखा है?
१२:०४ पर posdef

जवाबों:


149

स्ट्रीम ( InputStreamऔर OutputStream) बाइनरी डेटा ट्रांसफर करते हैं। यदि आप एक स्ट्रीम को एक स्ट्रिंग लिखना चाहते हैं, तो आपको पहले इसे बाइट्स में बदलना होगा , या दूसरे शब्दों में इसे एनकोड करना होगा। आप String.getBytes(Charset)विधि का उपयोग करके मैन्युअल रूप से (जैसा कि आप सुझाव देते हैं) कर सकते हैं , लेकिन आपको String.getBytes()विधि से बचना चाहिए , क्योंकि यह जेवीएम के डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जिसे पोर्टेबल तरीके से विश्वसनीय रूप से भविष्यवाणी नहीं की जा सकती है।

किसी स्ट्रीम में वर्ण डेटा लिखने का सामान्य तरीका, हालाँकि, स्ट्रीम को Writer((अक्सर PrintWriter) ए में लपेटना है , जो आपके write(String)(या print(String)) विधि को कॉल करने पर आपके लिए रूपांतरण करता है । InputStreams के लिए संबंधित आवरण एक रीडर है

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

आउटपुटस्ट्र्रीम के साथ PrintWriter का उदाहरण:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

3
तो उपयोग PrintWriterकरना वैसा ही है जैसा उपयोग करना String.getBytes()। यह जेवीएम के डिफ़ॉल्ट होने के लिए जो भी यादृच्छिक एन्कोडिंग का उपयोग करता है। तो यह केवल तभी काम करता है जब आप भाग्यशाली हों।
क्रिस्टोफर हम्मरस्ट्रॉम

106

आउटपुटस्ट्रीम बाइट्स लिखता है, स्ट्रिंग चर प्रदान करता है। आपको बाइट को परिभाषित करने के लिए चारसेट को परिभाषित करना होगा []:

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

UTF-8अपनी पसंद के चारसेट में बदलें ।


3
निम्नलिखित पंक्ति के साथ आवेदन करें। ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
साहिल पटेल

32

आप अपने OutputStream के चारों ओर एक PrintStream रैपिंग बना सकते हैं और उसके बाद बस इसे प्रिंट (स्ट्रिंग) कहते हैं:

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();

2
बाइट्स में कनवर्ट करने के लिए PrintStream किस वर्ण सेट का उपयोग कर रहा है?
डीन हिलर


12

एक PrintWriter के साथ अपना OutputStream लपेटें और उस वर्ग पर प्रिंट विधियों का उपयोग करें। वे एक स्ट्रिंग में लेते हैं और आपके लिए काम करते हैं।


9

आप अपाचे कॉमन्स IO का उपयोग कर सकते हैं :

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}

IOUtils.write(String data, OutputStream output, Charset encoding)के रूप में कार्यान्वित किया जाता है output.write(data.getBytes(Charsets.toCharset(encoding))), इसलिए यदि कोई एन्कोडेड स्ट्रिंग बाइट सरणी में फिट नहीं हो सकती है
ūarūnas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.