Reader และ InputStream ต่างกันอย่างไร และเมื่อใช้อะไร? ถ้าฉันสามารถใช้ Reader เพื่ออ่านอักขระได้ทำไมฉันถึงใช้ inputstream ฉันเดาว่าจะอ่านวัตถุ?
Reader และ InputStream ต่างกันอย่างไร และเมื่อใช้อะไร? ถ้าฉันสามารถใช้ Reader เพื่ออ่านอักขระได้ทำไมฉันถึงใช้ inputstream ฉันเดาว่าจะอ่านวัตถุ?
คำตอบ:
InputStream เป็นวิธีการรับข้อมูลจากทรัพยากร จับไบต์ข้อมูลทีละไบต์โดยไม่ต้องทำการแปลใด ๆ หากคุณกำลังอ่านข้อมูลรูปภาพหรือไฟล์ไบนารีใด ๆ นี่คือสตรีมที่จะใช้
Reader ออกแบบมาสำหรับสตรีมอักขระ หากข้อมูลที่คุณกำลังอ่านเป็นข้อความทั้งหมด Reader จะดูแลการถอดรหัสอักขระให้คุณและให้อักขระ Unicode จากสตรีมอินพุตดิบ หากคุณกำลังอ่านข้อความประเภทใดก็ตามนี่คือสตรีมที่จะใช้
คุณสามารถรวม InputStream และเปลี่ยนเป็น Reader ได้โดยใช้คลาส InputStreamReader
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams ใช้เพื่ออ่านไบต์จากสตรีม ดังนั้นจึงมีประโยชน์สำหรับข้อมูลไบนารีเช่นรูปภาพวิดีโอและวัตถุที่ทำให้เป็นอนุกรม
ในทางกลับกันผู้อ่านเป็นสตรีมอักขระดังนั้นจึงใช้อ่านข้อมูลอักขระได้ดีที่สุด
read()
ไบต์ต่อไบต์และเมื่อใดควรใช้read(byte[])
อาร์เรย์ของไบต์ อย่างที่ฉันคิดว่าการอ่านอาร์เรย์ดีกว่าเสมอ แล้วคุณช่วยยกตัวอย่างได้ไหมว่าจะใช้read()
ไบต์ทีละไบต์หรือ read(byte[])
อาร์เรย์ของไบต์ได้ที่ไหน หรือ BufferedInputStream
.?
ผมคิดว่าแหล่งที่มาของความสับสนคือการที่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
ความเป็นมาของ InputStream & Reader:
ในช่วงแรก ๆ ของ java วิธีเดียวที่จะดำเนินการอินพุตคอนโซลคือการใช้ไบต์สตรีม (InputStream และ OutputStream)
ใช้กรณี:
วันนี้การใช้ไบต์สตรีมเพื่ออ่านสตรีมคอนโซลยังเป็นที่ยอมรับ อย่างไรก็ตามสำหรับแอปพลิเคชันเชิงพาณิชย์วิธีที่แนะนำสำหรับการอ่านอินพุตคอนโซลคือการใช้สตรีมแบบเน้นอักขระ (Reader) Reader ทำให้คุณเป็นสากลและดูแลรักษาได้ง่ายขึ้น
หมายเหตุ:นี่เป็นเพียงข้อมูลเพิ่มเติมสำหรับการสำรวจโค้ด Java I / O นั่นคือรูปแบบการออกแบบของการใช้งาน Java I / O เป็นไปตามรูปแบบการออกแบบมัณฑนากร หากคุณคุ้นเคยกับรูปแบบการออกแบบมัณฑนากรคุณสามารถติดตามการนำไปใช้งานได้อย่างง่ายดาย
หนึ่งยอมรับไบต์และอีกตัวยอมรับอักขระ
InputStream ยอมรับไบต์, Reader ยอมรับอักขระใน Java หนึ่งอักขระ = สองไบต์และ Reader ใช้บัฟเฟอร์ไม่ใช้ InputStream เก็บไฟล์ทั้งหมดในดิสก์หรือถ่ายโอนตามไบต์รวมถึงรูปภาพและวิดีโอ แต่อักขระอยู่ในหน่วยความจำดังนั้นจึงใช้ InputStream บ่อยครั้ง