ฉันจะเปลี่ยนสตริงให้เป็น InputStreamReader ในภาษาจาวาได้อย่างไร


คำตอบ:


327

ByteArrayInputStreamยังทำเคล็ดลับ:

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

จากนั้นแปลงเป็นโปรแกรมอ่าน:

InputStreamReader reader = new InputStreamReader(is);

3
คุณอาจต้องการรับชุดอักขระเริ่มต้นของแพลตฟอร์ม
บางครั้ง

2
ขอบคุณ เสร็จสิ้น วิธีที่ดีที่สุดในการตรวจสอบชุดอักขระเริ่มต้นของ plataform คืออะไร
กุยโด

5
หรือเพียงแค่ใช้ getBytes () โดยไม่มีพารามิเตอร์ ... ไม่ควรมีอยู่ แต่จะใช้การเข้ารหัสเริ่มต้น
Michael Borgwardt

1
ByteArrayInputStream : ตั้งแต่: JDK1.0 ไม่มีเหตุผลเล็กน้อยที่จะถือว่าคลาสนี้“ ตั้งแต่ Java 1.4” หมายเลขรุ่นที่ผิดนั้นแปลกมากโดยเฉพาะอย่างยิ่ง Java 1.4 ที่นำมาใช้NIOและมีเหตุผลเล็กน้อยที่จะแนะนำ API และตัวตายตัวแทนที่เป็นแนวคิดในรุ่นเดียวกัน
Holger

61

ฉันยังพบ apache IOUtilsเรียนสามัญดังนั้น:

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

35
การแปลงสตริง -> ไบต์ [] หรือในทางกลับกันโดยไม่พูดถึงการเข้ารหัสอักขระมักเป็นข้อบกพร่อง
Joachim Sauer

1
สิ่งนี้อาจทำให้ข้อมูลสูญหายทั้งนี้ขึ้นอยู่กับการเข้ารหัสแพลตฟอร์มเริ่มต้นและตัวอักษรในสตริง การระบุการเข้ารหัส Unicode สำหรับการเข้ารหัสและการถอดรหัสจะดีกว่า อ่านรายละเอียดเพิ่มเติมได้ที่: legalargumentexception.blogspot.com/2009/05/…
McDowell

พารามิเตอร์การเข้ารหัสไม่จำเป็นต้องใช้เพื่อรับไบต์ในการเข้ารหัสที่แน่นอนใช่ไหม ฉันคิดว่าตราบใดที่คุณเลือกการเข้ารหัสแบบเดียวกันสำหรับการโทร String # getBytes ตามที่คุณเลือกสำหรับตัวสร้าง InputSTreamReader มันไม่สำคัญเลยว่าคุณจะเลือกแบบไหน ฉันค่อนข้างแน่ใจว่า Joachim และ McDowell ผิดสำหรับคดีนี้โดยเฉพาะ ไม่มีความรู้การเข้ารหัสที่จำเป็นสำหรับการตัด InputStreamReader รอบ ๆ สตริง
Stijn de Witt

4
@ Stijn de Witt - ล่าช้าตอบฉันรู้ แต่ฉันเพิ่งเห็นสิ่งนี้ หากการเข้ารหัสแพลตฟอร์มเริ่มต้นไม่สนับสนุนจุดรหัสในสตริงการสูญเสียข้อมูลจะเกิดขึ้น หากการเข้ารหัสเริ่มต้นของคุณคือ UTF-8 ก็ไม่มีปัญหา หากคุณกำลังใช้งาน Windows คุณจะสูญเสียชุด Unicode ส่วนใหญ่เนื่องจาก JREs นั้นเป็นค่าเริ่มต้นสำหรับการเข้ารหัส "ANSI" แบบดั้งเดิม หลักฐานอยู่ในลิงค์ที่ฉันโพสต์ new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")จะไม่สูญเสีย
McDowell

ไชโยใช้ห้องสมุดของบุคคลที่สามในการเปลี่ยนสายการบินหนึ่งเป็นสายการบินที่มีขนาดใหญ่กว่า ไม่ต้องพูดเกี่ยวกับการแปลงอาเรย์ไร้ประโยชน์Stringเป็นbyte[]อาเรย์เพื่อแปลงไบท์กลับเป็นchars …
Holger

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);

ดี แต่บรรทัดที่ 2 ควรเป็นbyte[] bytes = charset.getBytes();
AabinGunz

1
ฉันไม่คิดอย่างนั้น Abhishek ในตัวอย่างของฉันสตริงเป็นอินสแตนซ์ของ String ที่คุณต้องการเข้าถึงโดยใช้ InputStreamReader
ชุดเครื่องมือ

3

คุณกำลังพยายามที่จะใช้ a) Readerฟังก์ชั่นการใช้งานไม่ได้InputStreamReaderหรือ b) InputStreamฟังก์ชั่นการใช้งานออกมาInputStreamReaderหรือไม่? คุณจะไม่ได้ข) ไม่ได้เป็นInputStreamReaderInputStream

วัตถุประสงค์ของการInputStreamReaderคือการใช้InputStream- แหล่งที่มาของไบต์ - Readerและถอดรหัสไบต์ที่ตัวอักษรในรูปแบบของ คุณมีข้อมูลเป็นตัวอักษรอยู่แล้ว (สตริงเดิมของคุณ) การเข้ารหัสสตริงของคุณเป็นไบต์และการถอดรหัสไบต์กลับไปที่ตัวอักษรจะเป็นการดำเนินการซ้ำซ้อน

ถ้าคุณกำลังพยายามที่จะได้รับจากแหล่งที่มาของการใช้งานReaderStringReader

หากคุณกำลังพยายามที่จะรับInputStream(ซึ่งให้คุณไบต์เท่านั้น) ใช้ apache คอมมอนส์IOUtils.toInputStream(..)ตามที่แนะนำโดยคำตอบอื่น ๆ ที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.