ByteArrayInputStream บทนำ
ByteArrayInputStream เป็นสตรีมอินพุตอาร์เรย์ไบต์ มันสืบทอดมาจากอินพุตสตรีม
มันมีบัฟเฟอร์ภายในที่มีไบต์อ่านจากสตรีม ในแง่ของ Layman บัฟเฟอร์ภายในของมันคืออาร์เรย์ของไบต์และ ByteArrayInputStream ถูกนำไปใช้เป็นหลักผ่านอาร์เรย์ของไบต์
เราทุกคนรู้ว่า InputStream ให้อินเทอร์เฟซออกไปด้านนอกผ่านการอ่าน () เพื่อให้พวกเขาอ่านข้อมูลไบต์ ในขณะที่ ByteArrayInputStream ภายในกำหนดตัวนับเพิ่มเติมที่ใช้ในการติดตามไบต์ถัดไปที่จะอ่านโดยวิธีการอ่าน ()
ตัวอย่างโค้ดสำหรับการใช้งานโดยละเอียดของ API ใน ByTeArrayInputStream โปรดดูรหัสตัวอย่าง (ByTeArrayInputStreamTest.java):
นำเข้า Java.io.ByTeArrayInputStream; นำเข้า Java.io.ByTeArrayOutputStream;/*** โปรแกรมทดสอบ ByteArrayInputStream*/คลาสสาธารณะ ByteArrayInputStreamTest // สอดคล้องกับจดหมายภาษาอังกฤษ "abcddefghijklmnopqrssttuvwxyz" ไบต์สุดท้ายไบต์สุดท้าย [] arrayletters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string tmp = สตริงใหม่ (arrayletters); System.out.println ("arrayletters ="+tmp); TesbyTearrayInputStream (); } / ** * byteArrayInputStream ฟังก์ชั่นการทดสอบ API * / โมฆะคงที่ส่วนตัว tesByTeArrayInputStream () {// สร้าง ByTeArrayInputStream BYTE BYTE สตรีมเนื้อหาคือ Arrayletters Array ByteArrayTream Bais = NEW BYTEARRAYINPUTSTREAM // อ่าน 5 ไบต์จากสตรีมไบต์สำหรับ (int i = 0; i <len; i ++) {// ถ้าคุณสามารถอ่านไบต์ถัดไปอ่านไบต์ถัดไปถ้า (bais.available ()> = 0) {// อ่าน "ไบต์ถัดไป System.out.printf ("%d: 0x%s/n", i, integer.tohexstring (TMP)); }} // ถ้า "ไบต์สตรีมนี้" ไม่รองรับฟังก์ชั่นการทำเครื่องหมายแล้วออกโดยตรงถ้า (! bais.marksupported ()) {system.out.println ("ไม่รองรับ!"); กลับ ; } // ทำเครื่องหมาย "ตำแหน่งการอ่านถัดไปในสตรีมไบต์" นั่นคือ - ทำเครื่องหมาย "0x66" เนื่องจาก 5 ไบต์ได้รับการอ่านมาก่อนตำแหน่งการอ่านถัดไปคือไบต์ที่ 6 "// (01)," พารามิเตอร์ 0 "ในฟังก์ชั่นเครื่องหมาย (0) ของคลาส BytearrayinputStream ไม่มีการอ่านอย่างมีนัยสำคัญ bais.mark (0); Bais.Read (buf, 0, len); สตรีมไบต์ "ถึง" ตำแหน่งที่ทำเครื่องหมายโดย mark () "นั่นคือ 0x66. bais.reset (); // อ่าน 5 ไบต์จาก" รีเซ็ตไบต์สตรีม "ลงใน buf นั่นคืออ่าน" 0x66, 0x67, 0x68, 0x69, 0x6a // แปลง buf เป็นสตริงสตริง อักขระที่สอดคล้องกันของ "0x66, 0x67, 0x68, 0x69, 0x6a" คือสตริง "fghij" str2 = สตริงใหม่ (buf); System.out.printf ("str2 =%s/n", str2); - ผลการทำงาน:
arrayletters = abcdefghijklmnopqrstuvwxyz0: 0x611: 0x622: 0x633: 0x644: 0x65str1 = klmnostr2 = fghij
ผลลัพธ์คำอธิบาย:
(01) Arrayletters เป็นอาร์เรย์ไบต์ ค่ารหัส ASCII ที่สอดคล้องกับ 0x61 คือ A ค่ารหัส ASCII ที่สอดคล้องกับ 0x62 คือ B และอื่น ๆ ...
(02) ByteArrayInputStream BAIS = ใหม่ ByteArrayInputStream (Arrayletters); ประโยคนี้คือการสร้าง "Byte Stream Bais" และเนื้อหาของมันคือ Arrayletters
(03) สำหรับ (int i = 0; i <len; i ++); จุดประสงค์ของสิ่งนี้สำหรับลูปคือการอ่าน 5 ไบต์จากสตรีมไบต์ ทุกครั้งที่ bais.read () เรียกว่าหนึ่งไบต์จะถูกอ่านจากสตรีมไบต์
(04) bais.mark (0); ประโยคนี้คือ "ตั้งเครื่องหมายของสตรีมไบต์" ในเวลานี้ค่าที่สอดคล้องกันของตำแหน่งเครื่องหมายคือ 0x66
(05) bais.skip (5); ประโยคนี้จะข้าม 5 ไบต์ หลังจากข้าม 5 ไบต์ค่าของไบต์อ่านถัดไปในสตรีมไบต์ที่สอดคล้องกันคือ 0x6b
(06) bais.read (buf, 0, len); ประโยคนี้คือ "อ่านข้อมูล LEN จากสตรีมไบต์และเขียนลงใน BUF 0 หมายถึงการเขียนจากตำแหน่งที่ 0 ของ BUF"
(07) bais.reset (); ประโยคนี้จะรีเซ็ต "ตำแหน่งการอ่านถัดไปในสตรีมไบต์" เป็น "ตำแหน่งที่ทำเครื่องหมายโดย Mark ()" นั่นคือ 0x66
หลังจากเรียนรู้กระแสอินพุต ByteArrayInputStream ต่อไปเราจะได้เรียนรู้การส่งสัญญาณเอาต์พุตที่สอดคล้องกัน ByteArrayOutputStream
ByteArrayOutputStream บทนำ
ByteArrayOutputStream เป็นสตรีมเอาต์พุตอาร์เรย์ไบต์ มันสืบทอดมาจาก outputstream
ข้อมูลใน ByteArrayOutputStream ถูกเขียนไปยังอาร์เรย์ไบต์ บัฟเฟอร์จะเติบโตโดยอัตโนมัติเมื่อข้อมูลถูกเขียนอย่างต่อเนื่อง ข้อมูลสามารถรับได้โดยใช้ tobytearray () และ toString ()
ตัวอย่างโค้ดสำหรับการใช้งานโดยละเอียดของ API ใน ByTeArrayOutputStream โปรดดูรหัสตัวอย่าง (ByTeArrayOutputStreamTest.java):
นำเข้า java.io.ioException; นำเข้า java.io.OutputStream; นำเข้า java.io.ByTeArrayOutputStream; นำเข้า Java.io.ByTeArrayInputStream;/** * ByTeArrayputTream โปรแกรมการทดสอบครั้งสุดท้าย // สอดคล้องกับจดหมายภาษาอังกฤษ "abcddefghijklmnopqrsttuvwxyz" byte สุดท้ายคงที่ [] arrayletters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สตริง tmp = สตริงใหม่ (arrayletters); //system.out.println("arrayletters="+tmp); TesbyTearrayOutputStream (); } / ** * byteArrayOutputStream ฟังก์ชั่นการทดสอบ API * / โมฆะคงที่ส่วนตัว tesbyTearrayOutputStream () {// สร้าง ByTeArrayOutputStream BYTE BYTE BYTEAROTUTPUTTREAM BAOS = ใหม่ ByTeArrayOutputStream (); // เขียนตัวอักษรสามตัว "A", "B" และ "C" ในทางกลับกัน 0x41 สอดคล้องกับ a, 0x42 สอดคล้องกับ b และ 0x43 สอดคล้องกับ C. baos.write (0x41); baos.write (0x42); baos.write (0x43); System.out.printf ("baos =%s/n", baos); // เขียน 5 ไบต์สุดท้ายจาก "3" ในอาร์เรย์ Arrayletters ลงใน BAOS // นั่นคือ "0x64, 0x65, 0x66, 0x67, 0x68" เขียนขึ้นตามลำดับนั่นคือ "defgh" baos.write (Arrayletters, 3, 5); System.out.printf ("baos =%s/n", baos); // คำนวณขนาดความยาว int = baos.size (); System.out.printf ("size =%s/n", ขนาด); // แปลงเป็นไบต์ [] อาร์เรย์ไบต์ [] buf = baos.tobytearray (); string str = สตริงใหม่ (buf); System.out.printf ("str =%s/n", str); // แปลงเป็นไบต์ [] อาร์เรย์ไบต์ [] buf = baos.tobytearray (); string str = สตริงใหม่ (buf); System.out.printf ("str =%s/n", str); // เขียน BAOS ไปยังสตรีมเอาท์พุทอื่นลอง {ByTeArrayOutputStream baos2 = ใหม่ bytearrayoutputStream (); baos.writeto ((outputstream) baos2); System.out.printf ("baos2 =%s/n", baos2); } catch (ioexception e) {e.printstacktrace (); - ผลการทำงาน:
BAOS = ABCBAOS = ABCDEFGHSIZE = 8STR = ABCDEFGHBAOS2 = ABCDEFGH