บทความนี้วิเคราะห์ความแตกต่างระหว่างสตรีมอักขระและสตรีมไบต์ใน Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. ไหลคืออะไร
สตรีมใน Java เป็นนามธรรมของลำดับไบต์ เราสามารถจินตนาการได้ว่ามีท่อน้ำ แต่ตอนนี้มันไม่ได้ไหลในท่อน้ำอีกต่อไป แต่เป็นลำดับไบต์ เช่นเดียวกับการไหลของน้ำลำธารในชวาก็มี "ทิศทางการไหล" วัตถุที่สามารถอ่านลำดับของไบต์เรียกได้ว่าเป็นสตรีมอินพุต วัตถุที่เขียนลำดับของไบต์เรียกว่ากระแสเอาต์พุต
2. สตรีมไบต์
หน่วยพื้นฐานที่สุดของการประมวลผลสตรีมไบต์ใน Java เป็นไบต์เดียวซึ่งมักจะใช้ในการประมวลผลข้อมูลไบนารี สองคลาสไบต์ขั้นพื้นฐานที่สุดใน Java คือ inputstream และ outputstream ซึ่งแสดงกลุ่มของสตรีมไบต์อินพุตพื้นฐานและสตรีมไบต์เอาต์พุตตามลำดับ ทั้งคลาส InputStream และคลาส OutputStream เป็นคลาสนามธรรม ในการใช้งานจริงเรามักจะใช้ชุดคลาสย่อยของพวกเขาที่ให้ไว้ในไลบรารีคลาส Java ลองใช้คลาส InputStream เป็นตัวอย่างเพื่อแนะนำสตรีมไบต์ใน Java
คลาส InputStream กำหนดวิธีการอ่านพื้นฐานสำหรับการอ่านไบต์จากสตรีมไบต์ คำจำกัดความของวิธีนี้มีดังนี้:
บทคัดย่อสาธารณะ int อ่าน () โยน ioexception;
นี่เป็นวิธีนามธรรมนั่นคือคลาสสตรีมไบต์อินพุตใด ๆ ที่ได้รับจากอินพุตสตรีมจำเป็นต้องใช้วิธีนี้ ฟังก์ชั่นของวิธีนี้คือการอ่านไบต์จากสตรีมไบต์และส่งคืน -1 หากถึงจุดสิ้นสุดมิฉะนั้นจะส่งคืนไบต์อ่าน สิ่งที่เราต้องทราบเกี่ยวกับวิธีนี้คือมันจะปิดกั้นและส่งคืนไบต์การอ่านหรือ -1 นอกจากนี้สตรีมไบต์ไม่รองรับการแคชโดยค่าเริ่มต้นซึ่งหมายความว่าทุกครั้งที่มีการเรียกวิธีการอ่านระบบปฏิบัติการจะขอให้ระบบปฏิบัติการอ่านหนึ่งไบต์ซึ่งมักจะมาพร้อมกับดิสก์ IO ดังนั้นมันจะไม่มีประสิทธิภาพ เพื่อนบางคนอาจคิดว่าวิธีการอ่านมากเกินไปในคลาสอินพุตสตรีมด้วยอาร์เรย์ไบต์เนื่องจากพารามิเตอร์สามารถอ่านหลายไบต์ในแต่ละครั้งโดยไม่ต้องดิสก์ IO บ่อยๆ กรณีนี้เป็นเช่นนั้น? ลองดูที่ซอร์สโค้ดของวิธีนี้:
Public Int Read (byte b []) พ่น IOException {return read (b, 0, b.length);}มันเรียกวิธีการอ่านโอเวอร์โหลดเวอร์ชันอื่นดังนั้นเราจะติดตามต่อไป:
การอ่าน int สาธารณะ (byte b [], int ปิด, int len) โยน ioexception {ถ้า (b == null) {โยน nullpointerexception ใหม่ (); } อื่นถ้า (ปิด <0 || len <0 || len> b.length - ปิด) {โยน indexoutofboundsexception ใหม่ (); } อื่นถ้า (len == 0) {return 0; } int c = read (); if (c == -1) {return -1; } b [ปิด] = (ไบต์) C; int i = 1; ลอง {สำหรับ (; i <len; i ++) {c = read (); if (c == -1) {break; } b [ปิด + i] = (ไบต์) c; }} catch (ioexception ee) {} return i; -จากรหัสข้างต้นเราจะเห็นว่าในความเป็นจริงวิธีการอ่าน (BYTE []) ยังใช้ลูปเพื่อเรียกวิธีการอ่าน () เพื่ออ่านในอาร์เรย์ไบต์ "ในครั้งเดียว" ดังนั้นโดยพื้นฐานแล้ววิธีนี้ไม่ได้ใช้บัฟเฟอร์หน่วยความจำ ในการใช้บัฟเฟอร์หน่วยความจำเพื่อปรับปรุงประสิทธิภาพการอ่านเราควรใช้ bufferedInputStream
3. สตรีมอักขระ
หน่วยพื้นฐานที่สุดของการประมวลผลสตรีมอักขระใน Java คือสัญลักษณ์ Unicode (ขนาด 2 ไบต์) ซึ่งมักจะใช้ในการประมวลผลข้อมูลข้อความ สัญลักษณ์ Unicode ที่เรียกว่าเป็นหน่วยรหัส Unicode ที่มีช่วง 0x0000 ~ 0xffff แต่ละหมายเลขในช่วงข้างต้นสอดคล้องกับอักขระ ประเภทสตริงใน Java เข้ารหัสอักขระในกฎ Unicode โดยค่าเริ่มต้นจากนั้นจัดเก็บไว้ในหน่วยความจำ อย่างไรก็ตามไม่เหมือนกับที่เก็บไว้ในหน่วยความจำข้อมูลที่เก็บไว้ในดิสก์มักจะมีวิธีการเข้ารหัสที่หลากหลาย การใช้วิธีการเข้ารหัสที่แตกต่างกันอักขระเดียวกันจะมีการเป็นตัวแทนไบนารีที่แตกต่างกัน ที่จริงสตรีมตัวละครทำงานเช่นนี้:
สตรีมอักขระเอาท์พุท: แปลงลำดับอักขระ (จริง ๆ แล้วลำดับสัญลักษณ์ Unicode) เป็นลำดับไบต์ภายใต้วิธีการเข้ารหัสที่ระบุจากนั้นเขียนลงในไฟล์;
สตรีมอักขระอินพุต: ถอดรหัสลำดับของไบต์ที่จะอ่านลงในลำดับอักขระที่สอดคล้องกัน (จริง ๆ แล้วลำดับสัญลักษณ์ Unicode) ในวิธีการเข้ารหัสที่ระบุเพื่อให้สามารถเก็บไว้ในหน่วยความจำ
เราใช้การสาธิตเพื่อทำความเข้าใจกระบวนการนี้ให้ลึกซึ้งยิ่งขึ้น รหัสตัวอย่างมีดังนี้:
นำเข้า java.io.fileWriter; นำเข้า java.io.ioException; คลาสสาธารณะ FileWriterDemo {โมฆะคงที่สาธารณะหลัก (String [] args) {fileWriter fileWriter = null; ลอง {ลอง {fileWriter = new FileWriter ("demo.txt"); filewriter.write ("สาธิต"); } ในที่สุด {fileWriter.close (); }} catch (ioexception e) {e.printstacktrace (); -ในรหัสข้างต้นเราใช้ FileWriter เพื่อเขียนสี่อักขระ "สาธิต" เพื่อ demo.txt เราใช้ WinHex บรรณาธิการเลขฐานสิบหกเพื่อดูเนื้อหาของ demo.txt:
ดังที่เห็นได้จากรูปด้านบน "การสาธิต" ที่เราเขียนถูกเข้ารหัสเป็น "64 65 6d 6d 6f" แต่เราไม่ได้ระบุวิธีการเข้ารหัสในรหัสด้านบนอย่างชัดเจน ในความเป็นจริงเมื่อเราไม่ได้ระบุวิธีการเข้ารหัสอักขระเริ่มต้นของระบบปฏิบัติการจะใช้เพื่อเข้ารหัสอักขระที่เราต้องการเขียน
เนื่องจากสตรีมอักขระจำเป็นต้องเสร็จสิ้นการแปลงลำดับสัญลักษณ์ Unicode เป็นวิธีการเข้ารหัสที่สอดคล้องกันก่อนเอาต์พุตจะใช้บัฟเฟอร์หน่วยความจำเพื่อจัดเก็บลำดับไบต์ที่แปลงแล้วและรอการแปลงให้เสร็จก่อนที่จะเขียนลงในไฟล์ดิสก์ด้วยกัน
4. ความแตกต่างระหว่างสตรีมอักขระและสตรีมไบต์
หลังจากคำอธิบายข้างต้นเราสามารถรู้ได้ว่าความแตกต่างหลักระหว่างสตรีมไบต์และสตรีมอักขระนั้นสะท้อนให้เห็นในด้านต่อไปนี้:
หน่วยพื้นฐานของการดำเนินการสตรีมไบต์คือไบต์ หน่วยพื้นฐานของการทำงานสตรีมอักขระคือสัญลักษณ์ Unicode
โดยค่าเริ่มต้นสตรีมไบต์ไม่ได้ใช้บัฟเฟอร์ สตรีมอักขระใช้บัฟเฟอร์
สตรีมไบต์มักใช้ในการประมวลผลข้อมูลไบนารี ในความเป็นจริงมันสามารถประมวลผลข้อมูลทุกประเภท แต่ไม่สนับสนุนการเขียนหรืออ่านสัญลักษณ์ Unicode โดยตรง สตรีมอักขระมักจะประมวลผลข้อมูลข้อความซึ่งรองรับการเขียนและอ่านสัญลักษณ์ Unicode
ข้างต้นเป็นความเข้าใจของฉันเกี่ยวกับสตรีมตัวละครและลำธารไบต์ในชวา หากมีคำอธิบายที่ไม่ชัดเจนหรือไม่ถูกต้องฉันหวังว่าคุณจะสามารถแก้ไขได้ ขอบคุณ