bufferedInputStream
BufferedInputStream เป็นกระแสอินพุตบัฟเฟอร์ มันสืบทอดมาจาก FilterInputStream
วัตถุประสงค์ของ bufferedInputStream คือการเพิ่มคุณสมบัติบางอย่างไปยังสตรีมอินพุตอื่นเช่นการให้ "ฟังก์ชั่นบัฟเฟอร์" และสนับสนุน "เครื่องหมาย () เครื่องหมาย" และ "รีเซ็ต () วิธีการรีเซ็ต"
BufferedInputStream ถูกนำไปใช้เป็นหลักผ่านอาร์เรย์บัฟเฟอร์ภายใน ตัวอย่างเช่นหลังจากสร้าง bufferedInputStream ที่สอดคล้องกับสตรีมอินพุตบางอย่างเมื่อเราอ่านข้อมูลของสตรีมอินพุตผ่านการอ่าน () bufferedInputStream จะเติมข้อมูลของสตรีมอินพุตลงในบัฟเฟอร์ในแบทช์ เมื่อใดก็ตามที่ข้อมูลในบัฟเฟอร์ถูกอ่านสตรีมอินพุตจะเติมบัฟเฟอร์ข้อมูลอีกครั้ง จะทำซ้ำจนกว่าเราจะอ่านตำแหน่งข้อมูลสตรีมอินพุตเสร็จแล้ว
รายการฟังก์ชัน BufferedInputStream:
bufferedInputStream (inputstream in) bufferedInputStream (inputstream ใน, ขนาด int) ซิงโครไนซ์ int () void close () เครื่องหมายโมฆะซิงโครไนซ์ (int readlimit) boolean marksupported () synchronized synchronized () Bytecount)
รหัสตัวอย่าง:
สำหรับการใช้งานโดยละเอียดของ API ใน BufferedInputStream โปรดดูรหัสตัวอย่าง (BufferedInputStreamTest.java):
นำเข้า java.io.bufferedInputstream; นำเข้า java.io.bytearrayinputstream นำเข้า java.io.file; นำเข้า java.io.inputstream; นำเข้า java.io.fileinputstream; นำเข้า Java.io.ioException; โปรแกรมทดสอบ * * @author Skywang */คลาสสาธารณะ BufferedInputStreamTest {ส่วนตัวคงที่ int สุดท้าย len = 5; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {testBufferedInputStream (); } / *** ฟังก์ชั่นการทดสอบ API ของ BufferedInputStream* / Void Private Static Void TestBufferedInputStream () {// สร้างสตรีม BufferedInputStream ไบต์เนื้อหาเป็นอาร์เรย์ Arrayletters ลอง {ไฟล์ = ไฟล์ใหม่ ("bufferedInputStream.txt"); inputStream ใน = ใหม่ bufferedInputStream (ใหม่ FileInputStream (ไฟล์), 512); // อ่าน 5 ไบต์จากสตรีมไบต์ "abcde", A สอดคล้องกับ 0x61, b สอดคล้องกับ 0x62 และอื่น ๆ ... สำหรับ (int i = 0; i <len; i ++) {// ถ้าคุณสามารถอ่านไบต์ถัดไปอ่านไบต์ถัดไปถ้า (in.available ()> = 0) {// อ่าน System.out.printf ("%d: 0x%s/n", i, integer.tohexstring (TMP)); }} // ถ้า "สตรีมไบต์นี้" ไม่รองรับฟังก์ชั่นการทำเครื่องหมายออกไปโดยตรงถ้า (! in.marksupported ()) {system.out.println ("ไม่รองรับ!"); กลับ ; } // mark "ตำแหน่งดัชนีปัจจุบัน" นั่นคือทำเครื่องหมายองค์ประกอบของตำแหน่งที่ 6 - "F" // 1024 สอดคล้องกับ marklimit in.mark (1024); // ข้าม 22 ไบต์ in.skip (22); // อ่าน 5 ไบต์ไบต์ [] buf = ไบต์ใหม่ [len]; in.read (buf, 0, len); // แปลง buf เป็นสตริงสตริง string str1 = สตริงใหม่ (buf); System.out.printf ("str1 =%s/n", str1); // รีเซ็ต "ดัชนีของสตรีมอินพุต" เป็นตำแหน่งที่ทำเครื่องหมายด้วย Mark () นั่นคือรีเซ็ตเป็น "F" in.reset (); // อ่าน 5 ไบต์เป็น buf จาก "รีเซ็ตไบต์สตรีม" นั่นคืออ่าน "fghij" in.read (buf, 0, len); // แปลง buf เป็นสตริงสตริง string str2 = สตริงใหม่ (buf); System.out.printf ("str2 =%s/n", str2); in.close (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (SecurityException E) {E.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); - เนื้อหาของ bufferedInputStream.txt อ่านในโปรแกรมมีดังนี้:
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
ผลการทำงาน:
0: 0x611: 0x622: 0x633: 0x644: 0x65str1 = 01234str2 = fghij
BufferedOutputStream
BufferedOutputStream เป็นกระแสเอาต์พุตบัฟเฟอร์ มันสืบทอดมาจาก FilterOutputStream
ฟังก์ชั่นของ bufferedOutputStream คือการจัดเตรียม "บัฟเฟอร์" ไปยังสตรีมเอาต์พุตอื่น
รายการฟังก์ชั่น BufferedOutputStream:
BufferedOutputStream (OutputStream) bufferedOutputStream (เอาท์พุทสตรีมออกขนาด int) void close () void flush () void flush () void void void cynchronized void ()
รหัสตัวอย่าง:
สำหรับการใช้งานโดยละเอียดของ API ใน BufferedOutputStream โปรดดูรหัสตัวอย่าง (bufferedOutputStreamTest.java):
นำเข้า java.io.bufferedOutputStream; นำเข้า java.io.file; นำเข้า java.io.OutputStream; นำเข้า java.io.fileOutputStream; นำเข้า Java.io.ioException; นำเข้า Java.Io.filenotfoundException; @author Skywang */คลาสสาธารณะ BufferedOutputStreamTest {ส่วนตัวคงที่สุดท้าย int len = 5; // สอดคล้องกับตัวอักษรภาษาอังกฤษ "ABCDDEFGHIJKLMNOPQRSSTTUVWXYZ" BYTE สุดท้ายของ BYTE [] ArrayLetters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {testBufferedOutputStream (); } / *** ฟังก์ชั่นการทดสอบ API ของ BufferedOutputStream* / Void Private Static Void TestBufferedOutputStream () {// สร้าง bufferedOutputStream ที่สอดคล้องกับ "สตรีมเอาต์พุตไฟล์" // ขนาดบัฟเฟอร์ที่สอดคล้องกันคือ 16 นั่นคือเมื่อข้อมูลบัฟเฟอร์> = 16 เนื้อหาของบัฟเฟอร์ ลอง {file file = ไฟล์ใหม่ ("out.txt"); OutputStream OUT = ใหม่ bufferedOutputStream (ใหม่ fileOutputStream (ไฟล์), 16); // เขียน 10 ไบต์แรกของอาร์เรย์ Arrayletters ไปยังสตรีมเอาท์พุท Out.write (Arrayletters, 0, 10); // เขียน "newline/n" ไปยังสตรีมเอาต์พุต out.write ('/n'); // TODO! // out.flush (); ReadUserInput (); out.close (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (SecurityException E) {E.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }} / *** อ่านอินพุตของผู้ใช้* / โมฆะส่วนตัวคงที่ readUserInput () {System.out.println ("โปรดป้อนข้อความ:"); เครื่องสแกนเนอร์ = สแกนเนอร์ใหม่ (System.in); // รอสตริงอินพุต str = reader.next (); System.out.printf ("อินพุตคือ: %s/n", str); - ผลการทำงาน:
สร้างไฟล์ "out.txt" และเนื้อหาของไฟล์คือ "abcdefghij"
การทดสอบทีละขั้นตอน: ทำตามสามขั้นตอนต่อไปนี้เพื่อทดสอบโปรแกรมเพื่อดูขนาดบัฟเฟอร์และบทบาทของ Flush ()
ประเภท 1: โปรแกรมดั้งเดิม
(1) เรียกใช้โปรแกรม เมื่อโปรแกรมกำลังรอการป้อนข้อมูลผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; ค้นหา: เนื้อหาว่างเปล่า
(2) เรียกใช้โปรแกรม หลังจากอินพุตผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; ค้นหา: เนื้อหาคือ "abcdefghij"
จากนี้เราพบว่าผลลัพธ์ของ (01) และ (02) แตกต่างกัน เหตุผลที่เนื้อหา out.txt ใน (01) ว่างเปล่าเป็นเพราะขนาดบัฟเฟอร์ที่สอดคล้องกับ out.txt คือ 16 ไบต์และเราเขียนเพียง 11 ไบต์ดังนั้นจึงไม่ดำเนินการบัฟเฟอร์ที่ชัดเจน (เช่นเขียนข้อมูลบัฟเฟอร์ไปยังสตรีมเอาท์พุท)
เนื้อหาที่สอดคล้องกับ out.txt คือ "abcdefghij" เนื่องจาก out.close () ถูกดำเนินการซึ่งปิดสตรีมเอาต์พุต ก่อนที่จะปิดสตรีมเอาต์พุตข้อมูลบัฟเฟอร์จะถูกเขียนไปยังสตรีมเอาต์พุต
หมายเหตุ: เมื่อทำการทดสอบซ้ำก่อนอื่นให้ลบออก. txt
ประเภท 2: เพิ่มคำสั่งต่อไปนี้ก่อน readuserInput ()
out.flush ();
จุดประสงค์ของประโยคนี้คือการเขียน "เนื้อหาบัฟเฟอร์" ลงในสตรีมเอาต์พุต
(1) เรียกใช้โปรแกรม เมื่อโปรแกรมกำลังรอการป้อนข้อมูลผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; ค้นหา: เนื้อหาคือ "abcdefghij"
(2) เรียกใช้โปรแกรม หลังจากอินพุตผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; ค้นหา: เนื้อหาคือ "abcdefghij"
จากนี้เราพบว่าผลลัพธ์เดียวกันกับ (01) และ (02) เนื้อหาที่เกี่ยวข้องของ Out.txt คือ "ABCDEFGHIJ" นี่เป็นเพราะการดำเนินการ Flush () ดำเนินการซึ่งใช้ในการเขียนข้อมูลบัฟเฟอร์ไปยังสตรีมเอาต์พุต
หมายเหตุ: เมื่อทำการทดสอบซ้ำให้ลบออก. txt ก่อน!
ประเภท 3: ขึ้นอยู่กับประเภทแรก
out.write (Arrayletters, 0, 10);
ดัดแปลงเป็น
out.write (Arrayletters, 0, 20);
(1) เรียกใช้โปรแกรม เมื่อโปรแกรมกำลังรอการป้อนข้อมูลผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; พบว่าเนื้อหาคือ "abcdefghijklmnopqrst" (ไม่รวม Enter)
(02) เรียกใช้โปรแกรม หลังจากอินพุตผู้ใช้ให้ตรวจสอบเนื้อหาข้อความของ "out.txt"; พบว่าเนื้อหาคือ "abcdefghijklmnopqrst" (รวมถึง Enter)
จากนี้เราพบว่า (01) ผลลัพธ์ของการรันคือ "ABCDEFGHIJKLMNOPQRST" (ไม่รวมการคืนรถ) นี่เป็นเพราะขนาดของบัฟเฟอร์คือ 16 และเราเขียน 20 ไบต์ผ่าน Out.write (Arrayletters, 0, 20) เกินขนาดของบัฟเฟอร์ ในเวลานี้อินพุตทั้งหมดจะถูกเขียนลงในกระแสเอาต์พุตโดยตรงโดยไม่ผ่านบัฟเฟอร์
(3) ผลลัพธ์ของการดำเนินการคือ "abcdefghijklmnopqrst" (รวมถึงการคืนค่าการขนส่ง) เพราะเมื่อดำเนินการ out.close () สัญลักษณ์การคืนค่าการขนส่ง '/n' ถูกเขียนลงในกระแสเอาต์พุต
หมายเหตุ: เมื่อทำการทดสอบซ้ำให้ลบออก. txt ก่อน!