ในส่วนก่อนหน้านี้ เราได้เรียนรู้เกี่ยวกับสตรีมอินพุตและเอาท์พุตของไฟล์ไบต์ และสตรีมอินพุตและเอาท์พุตอักขระของไฟล์ ในส่วนนี้ เราเรียนรู้แนวคิดใหม่ - สตรีมบัฟเฟอร์ ดังนั้นกระแสบัฟเฟอร์คืออะไร? บัฟเฟอร์สตรีมมีบทบาทอะไรได้บ้าง
ใน Java เราเรียกอ็อบเจ็กต์ที่สร้างขึ้นโดยคลาส BufferedReader และ BufferedWriter ที่บัฟเฟอร์อินพุตและเอาต์พุตสตรีม ซึ่งเพิ่มความสามารถในการอ่านและเขียนไฟล์ ตัวอย่างเช่น Student.txt คือรายชื่อนักเรียน โดยแต่ละชื่อมีหนึ่งบรรทัด หากเราต้องการอ่านชื่อเราต้องอ่านทีละบรรทัด เป็นการยากที่จะทำงานดังกล่าวให้เสร็จสิ้นโดยใช้สตรีม FileReader เพราะเราไม่รู้ว่ามีอักขระกี่ตัวในบรรทัดและคลาส FileReader ไม่มี จัดให้มีวิธีการอ่านบรรทัด
Java จัดเตรียมสตรีมขั้นสูงเพิ่มเติม: สตรีม BufferedReader และสตรีม BufferedWriter แหล่งที่มาและปลายทางของทั้งสองต้องเป็นสตรีมอินพุตอักขระและสตรีมเอาต์พุตอักขระ ดังนั้น หากใช้สตรีมอินพุตอักขระของไฟล์เป็นแหล่งที่มาของสตรีม BufferedReader และใช้สตรีมเอาต์พุตอักขระของไฟล์เป็นปลายทางของสตรีม BufferedWriter ดังนั้นสตรีมที่สร้างโดยคลาส BufferedReader และ BufferedWriter จะมีการอ่านและการเขียนที่แข็งแกร่งยิ่งขึ้น ความสามารถมากกว่าสตรีมอินพุตอักขระและสตรีมเอาต์พุตอักขระ ตัวอย่างเช่น สตรีม BufferedReader สามารถอ่านไฟล์ทีละบรรทัดได้
ตัวสร้างของคลาส BufferedReader และ BufferedWriter คือ:
BufferedReader (Readerin); BufferedWriter (เขียน);
สตรีม BufferedReader สามารถอ่านบรรทัดข้อความโดยใช้ readLine() สร้างอ็อบเจ็กต์ BufferedReader โดยการส่งอ็อบเจ็กต์ของคลาสย่อย Reader เช่น อินสแตนซ์ของ FileReader ไปยัง BufferedReader ตัวอย่างเช่น:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
จากนั้นสตรีม inTwo จะเรียกใช้เมธอด readLine() เพื่ออ่าน Student.txt เช่น:
StringstrLine=inTwo.readLine();
ในทำนองเดียวกัน คุณสามารถเชื่อมต่อกระแสข้อมูล BufferedWriter และกระแสข้อมูล FileWriter เข้าด้วยกัน จากนั้นใช้กระแสข้อมูล BufferedWriter เพื่อเขียนข้อมูลไปยังปลายทาง ตัวอย่างเช่น:
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
จากนั้นใช้วิธีการเขียน (String s, int off, int len) ของคลาส BufferedReader เพื่อเขียนสตริง s ไปที่ hello.txt พารามิเตอร์ off คือออฟเซ็ตจากจุดเริ่มต้นของ s และ len คือจำนวนอักขระที่เขียน .
นอกจากนี้ สตรีม BufferedWriter ยังมีวิธีการเฉพาะในการเขียน อักขระขึ้นบรรทัดใหม่ลง ในไฟล์:
บรรทัดใหม่();
BufferedReader และ BufferedWriter สามารถเรียกว่าสตรีมบน และสตรีมอักขระที่ชี้ไปเรียกว่าสตรีมพื้นฐาน Java ใช้เทคโนโลยีแคชเพื่อเชื่อมต่อสตรีมบนและสตรีมพื้นฐาน สตรีมอินพุตอักขระพื้นฐานจะอ่านข้อมูลลงในแคชก่อน จากนั้นสตรีม BufferedReader จะอ่านข้อมูลจากแคช สตรีม BufferedWriter เขียนข้อมูลลงในแคช และสตรีมเอาท์พุตอักขระต้นแบบจะเขียนข้อมูลในแคชไปยังปลายทางอย่างต่อเนื่อง . เมื่อสตรีม BufferedWriter เรียกล้าง () เพื่อรีเฟรชแคชหรือเรียกเมธอด close() เพื่อปิด แม้ว่าแคชจะไม่ล้น กระแสข้อมูลพื้นฐานจะเขียนเนื้อหาแคชไปยังปลายทางทันที
หมายเหตุ : เมื่อปิดสตรีมเอาต์พุต คุณต้องปิดสตรีมเอาต์พุตแบบบัฟเฟอร์ก่อน จากนั้นจึงปิดสตรีมที่ชี้ไปที่สตรีมเอาต์พุตแบบบัฟเฟอร์ นั่นคือ ปิดสตรีมด้านบนก่อน แล้วจึงปิดสตรีมด้านล่าง เพียงปิดสตรีมด้านบนเมื่อเขียนโค้ด และสตรีมที่อยู่ด้านล่างของสตรีมด้านบนจะถูกปิดโดยอัตโนมัติ
ตัวอย่างเช่น:
ไฟล์ english.txt ประกอบด้วยประโยคภาษาอังกฤษมีดังต่อไปนี้ แต่ละประโยคจะมีหนึ่งบรรทัด:
Thearrowพลาดเป้าหมายพวกเขาปฏิเสธความต้องการสหภาพถนนนี้ไปที่ไหน?
จำเป็นต้องอ่าน english.txt ทีละบรรทัด เพิ่มจำนวนคำที่มีอยู่ในประโยคภาษาอังกฤษหลังบรรทัด จากนั้นเขียนบรรทัดลงในไฟล์ชื่อ englishCount.txt โดยมีโค้ดดังนี้:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);ลอง{Writerout=newFileWriter(fWrite);BufferedWriterbufferWrite= newBufferedWriter(ออก);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null; While((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTokenizer(str);intcount=fenxi. countTokens();str=str+จำนวนคำในประโยค:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite) ;bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+content:);ในขณะที่((s=bufferRead.readLine())!=null){System.out.println( s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
ผลการวิ่งมีดังนี้:
เนื้อหาภาษาอังกฤษCount.txt:Thearrowmissedthetargetจำนวนคำในประโยค:5พวกเขาปฏิเสธความต้องการสหภาพจำนวนคำในประโยค:5Wheredoesthisroadgoto?จำนวนคำในประโยค:6