मैं जावा में एक स्ट्रिंग को एक इनपुटस्ट्रीमरिएडर में कैसे बदलूं?


281

मैं किसी Stringमान को a में कैसे बदल सकता हूं InputStreamReader?

जवाबों:


327

ByteArrayInputStream भी करता है चाल:

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

फिर पाठक में परिवर्तित करें:

InputStreamReader reader = new InputStreamReader(is);

3
आप प्लेटफ़ॉर्म के डिफ़ॉल्ट चार्ट को इनहेरिट करना चाह सकते हैं
स्लिम

2
धन्यवाद। किया हुआ। प्लेटफॉर्म के डिफॉल्ट चार्टसेट का पता लगाने का सबसे अच्छा तरीका क्या है?
गुइडो

5
या बस एक पैरामीटर के बिना getBytes () का उपयोग करें ... संभवतः यह मौजूद नहीं होना चाहिए, लेकिन यह डिफ़ॉल्ट एन्कोडिंग का उपयोग करेगा।
माइकल बोर्गवर्ड

1
ByteArrayInputStream : चूंकि: JDK1.0 यह मानने का कोई मामूली कारण नहीं है कि यह वर्ग "जावा 1.4 के बाद से" है। वह गलत संस्करण संख्या विशेष रूप से अजीब है जैसा कि जावा 1.4 पेश किया गया है NIOऔर यह उसी संस्करण के भीतर एक एपीआई और इसके वैचारिक उत्तराधिकारी को पेश करने के लिए बहुत कम समझ में आता है।
होल्गर

61

मुझे अपाचे कॉमन्स IOUtilsक्लास भी मिली , इसलिए:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

35
स्ट्रिंग-> बाइट [] या इसके विपरीत एक चरित्र एन्कोडिंग का उल्लेख किए बिना परिवर्तित करना लगभग हमेशा एक बग है।
जोकिम सॉउर

1
यह स्ट्रिंग में डिफ़ॉल्ट प्लेटफ़ॉर्म एन्कोडिंग और वर्णों के आधार पर डेटा हानि का कारण हो सकता है। एन्कोडिंग और डिकोडिंग संचालन दोनों के लिए एक यूनिकोड एन्कोडिंग निर्दिष्ट करना बेहतर होगा। इसे और अधिक जानकारी के लिए पढ़ें: illegalargumentexception.blogspot.com/2009/05/…
McDowell

क्या एन्कोडिंग परम को सिर्फ एक निश्चित एन्कोडिंग में बाइट्स प्राप्त करने की आवश्यकता नहीं है? मुझे लगता है कि जब तक आप String # getBytes कॉल के लिए समान एन्कोडिंग चुनते हैं, जैसा कि आप InputSTreamReader कंस्ट्रक्टर के लिए चुनते हैं, यह वास्तव में कोई फर्क नहीं पड़ता कि आप किसे चुनते हैं। मुझे पूरा यकीन है कि जोकिम और मैकडॉवेल इस विशिष्ट मामले के लिए गलत हैं। एक स्ट्रिंग के चारों ओर एक InputStreamReader लपेटने के लिए आवश्यक कोई एन्कोडिंग ज्ञान नहीं है।
Stijn de Witt

4
@Stijn de Witt - जवाब में मुझे पता है, लेकिन मैंने अभी यह देखा। यदि डिफ़ॉल्ट प्लेटफ़ॉर्म एन्कोडिंग स्ट्रिंग में कोड बिंदुओं का समर्थन नहीं करता है, तो डेटा हानि का परिणाम होगा। यदि आपका डिफ़ॉल्ट एन्कोडिंग UTF-8 है, तो कोई समस्या नहीं है। यदि आप विंडोज पर चल रहे हैं, तो आप अधिकांश यूनिकोड सेट को खो देंगे क्योंकि उन JRE की विरासत "ANSI" एन्कोडिंग के लिए डिफ़ॉल्ट है। प्रमाण मेरे द्वारा पोस्ट किए गए लिंक में है। new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")दोषरहित होगा।
मैकडॉवेल

हुर्रे, एक 3-लाइन लाइब्रेरी का उपयोग करके एक-लाइनर को ... एक बड़ा-लाइनर बनाने के लिए। बाइट्स को फिर से एस में बदलने के लिए Stringएक byte[]सरणी में बेकार रूपांतरण के बारे में बात करने के लिए नहीं char...
होल्गर

32

क्या यह विशेष रूप से एक InputStreamReader होना चाहिए? StringReader का उपयोग कैसे करें ?

अन्यथा, आप StringBufferInputStream का उपयोग कर सकते हैं , लेकिन यह चरित्र रूपांतरण मुद्दों (जिसके कारण आपको StringReader को प्राथमिकता देना चाहिए) के कारण पदावनत कर दिया गया है।


16

@Dan के रूप में एक ही सवाल - क्यों नहीं StringReader ?

अगर यह InputStreamReader होना है, तो:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);

अच्छा है, लेकिन दूसरी पंक्ति होनी चाहिएbyte[] bytes = charset.getBytes();
AabinGunz

1
मुझे नहीं लगता कि अभिषेक। मेरे उदाहरण में, स्ट्रिंग स्ट्रिंग का उदाहरण है जिसे आप InputStreamReader का उपयोग करके एक्सेस करना चाहते हैं।
टूलकिट

3

क्या आप Readerबाहर से InputStreamReader(a) InputStreamकार्यक्षमता या b) कार्यक्षमता प्राप्त करने का प्रयास कर रहे हैं InputStreamReader? आपको b) नहीं मिलेगा। InputStreamReaderएक नहीं है InputStream

के प्रयोजन के InputStreamReaderलिए एक लेने के लिए है InputStreamएक के रूप में वर्ण के लिए और डिकोड बाइट्स - बाइट्स का एक स्रोत - Reader। आपके पास पहले से ही आपके डेटा को चार्ट (आपका मूल स्ट्रिंग) के रूप में है। अपने स्ट्रिंग को बाइट्स में एन्कोड करना और बाइट्स को वापस चार्ज़ में डिकोड करना एक बेमानी कार्रवाई होगी।

यदि आप Readerअपने स्रोत से बाहर निकलने की कोशिश कर रहे हैं , तो उपयोग करें StringReader

यदि आप एक InputStream(जो आपको केवल बाइट्स देते हैं) पाने की कोशिश कर रहे हैं , तो IOUtils.toInputStream(..)यहां अन्य उत्तरों द्वारा सुझाए अनुसार एपाचे कॉमन्स का उपयोग करें।


2

आप कैक्टस की कोशिश कर सकते हैं :

InputStream stream = new InputStreamOf(str);

फिर, अगर आपको एक की जरूरत है Reader:

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