Reader และ InputStream ต่างกันอย่างไร


87

Reader และ InputStream ต่างกันอย่างไร และเมื่อใช้อะไร? ถ้าฉันสามารถใช้ Reader เพื่ออ่านอักขระได้ทำไมฉันถึงใช้ inputstream ฉันเดาว่าจะอ่านวัตถุ?


3
เกี่ยวกับ "ฉันเดาว่าจะอ่านวัตถุ?" มีสตรีมอินพุต / เอาท์พุตพิเศษสำหรับการอ่าน / เขียนออบเจ็กต์ Java พวกเขาคือ ObjectInputStream และ ObjectOutputStream ตามลำดับและเป็นส่วนหนึ่งของกรอบการทำให้เป็นอนุกรมที่ใหญ่กว่า java.sun.com/developer/technicalArticles/Programming/… แต่นั่นเป็นเพียงการใช้อินพุต / เอาต์พุตสตรีมเพียงครั้งเดียวคนอื่น ๆ สามารถส่งข้อมูลผ่านซ็อกเก็ตได้เป็นต้น
Mark Peters

คำตอบ:


138

InputStream เป็นวิธีการรับข้อมูลจากทรัพยากร จับไบต์ข้อมูลทีละไบต์โดยไม่ต้องทำการแปลใด ๆ หากคุณกำลังอ่านข้อมูลรูปภาพหรือไฟล์ไบนารีใด ๆ นี่คือสตรีมที่จะใช้

Reader ออกแบบมาสำหรับสตรีมอักขระ หากข้อมูลที่คุณกำลังอ่านเป็นข้อความทั้งหมด Reader จะดูแลการถอดรหัสอักขระให้คุณและให้อักขระ Unicode จากสตรีมอินพุตดิบ หากคุณกำลังอ่านข้อความประเภทใดก็ตามนี่คือสตรีมที่จะใช้

คุณสามารถรวม InputStream และเปลี่ยนเป็น Reader ได้โดยใช้คลาส InputStreamReader

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

คำตอบที่ไร้ที่ติเบริน! ขอบคุณ!
Gaurav

18

InputStreams ใช้เพื่ออ่านไบต์จากสตรีม ดังนั้นจึงมีประโยชน์สำหรับข้อมูลไบนารีเช่นรูปภาพวิดีโอและวัตถุที่ทำให้เป็นอนุกรม

ในทางกลับกันผู้อ่านเป็นสตรีมอักขระดังนั้นจึงใช้อ่านข้อมูลอักขระได้ดีที่สุด


เมื่อใดควรใช้read()ไบต์ต่อไบต์และเมื่อใดควรใช้read(byte[])อาร์เรย์ของไบต์ อย่างที่ฉันคิดว่าการอ่านอาร์เรย์ดีกว่าเสมอ แล้วคุณช่วยยกตัวอย่างได้ไหมว่าจะใช้read()ไบต์ทีละไบต์หรือ read(byte[])อาร์เรย์ของไบต์ได้ที่ไหน หรือ BufferedInputStream.?
Asif Mushtaq

11

ผมคิดว่าแหล่งที่มาของความสับสนคือการที่InputStream.read()ส่งกลับintและยังส่งกลับReader.read()int

ความแตกต่างคือInputStream.read()ส่งคืนค่าไบต์ระหว่าง 0 ถึง 255 ที่สอดคล้องกับเนื้อหาดิบของสตรีมไบต์และReader.read()ส่งคืนค่าอักขระซึ่งอยู่ระหว่าง 0 ถึง 65357 (เนื่องจากมีจุดรหัสยูนิโคดที่แตกต่างกัน 65358 จุด)

InputStreamช่วยให้คุณอ่านเนื้อหาไบต์โดยไบต์เช่นเนื้อหาว่า "‡" การอ่านเป็นกระแสของ 5 ไบต์ (แต่ละคนแสดงเป็นต์intระหว่าง 0 และ 255) ส่ง97, 226, 128, 161และ97ที่

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

Readerช่วยให้คุณอ่านตัวอักษรเนื้อหาโดยตัวละครเพื่อให้เนื้อหาว่า "‡" การอ่านเป็น 3 ตัวอักษร97, 8225และ97ที่

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

อักขระ‡เรียกว่าU + 2021 ใน Unicode


นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ขอบคุณสำหรับตัวอย่าง
alegria

2

ความเป็นมาของ InputStream & Reader:

ในช่วงแรก ๆ ของ java วิธีเดียวที่จะดำเนินการอินพุตคอนโซลคือการใช้ไบต์สตรีม (InputStream และ OutputStream)

ใช้กรณี:

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

หมายเหตุ:นี่เป็นเพียงข้อมูลเพิ่มเติมสำหรับการสำรวจโค้ด Java I / O นั่นคือรูปแบบการออกแบบของการใช้งาน Java I / O เป็นไปตามรูปแบบการออกแบบมัณฑนากร หากคุณคุ้นเคยกับรูปแบบการออกแบบมัณฑนากรคุณสามารถติดตามการนำไปใช้งานได้อย่างง่ายดาย



0

InputStream ยอมรับไบต์, Reader ยอมรับอักขระใน Java หนึ่งอักขระ = สองไบต์และ Reader ใช้บัฟเฟอร์ไม่ใช้ InputStream เก็บไฟล์ทั้งหมดในดิสก์หรือถ่ายโอนตามไบต์รวมถึงรูปภาพและวิดีโอ แต่อักขระอยู่ในหน่วยความจำดังนั้นจึงใช้ InputStream บ่อยครั้ง

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