โปรแกรมมักจะมีข้อกำหนดในการเขียนข้อมูลไปยังไฟล์หรือที่อื่นอย่างรวดเร็ว และสิ่งนี้ทำให้เกิดคำถาม: เราควรทำอย่างไร? เราควรเลือกเรียนคณะไหนดี? วันนี้เราจะทำความรู้จักกับผู้สมัครที่เหมาะสมสำหรับตำแหน่งนี้ — คลาสBufferedWriter
ทำไมเราต้องการ BufferedWriter
BufferedWriter เป็นคลาสที่เขียนอักขระบัฟเฟอร์ลงในสตรีม ช่วยให้คุณลดจำนวนครั้งที่คุณเข้าถึงสื่อทางกายภาพ นั่นคือ แทนที่จะเขียนอักขระตัวเดียวในแต่ละครั้ง จะเขียนข้อมูลลงในบัฟเฟอร์ แล้วเขียนอักขระทั้งหมดลงในสื่อพร้อมกัน
สิ่งนี้จะเพิ่มความเร็วในการเขียนอย่างมาก ขนาดบัฟเฟอร์เริ่มต้นคือ 8192 อักขระ แต่สามารถเปลี่ยนแปลงได้โดยการระบุขนาดใหม่ในตัวสร้าง:
BufferedWriter(Writer in, int sz)
ที่นี่ อาร์กิวเมนต์แรกของตัวสร้างคือสตรีมที่จะรับข้อมูลที่เราเขียน และปรากฎว่าszคือขนาดของบัฟเฟอร์ใหม่
Java ยังมี คลาส BufferedReader : ใช้สำหรับการอ่านข้อมูลแบบบัฟเฟอร์
บัฟเฟอร์คืออะไรกันแน่? ลองมาตัวอย่างชีวิตจริง บัฟเฟอร์เปรียบเสมือนตะกร้าหรือรถเข็นในซุปเปอร์มาร์เก็ต แทนที่จะเดินไปชำระเงินด้วยสินค้าเพียงชิ้นเดียว จ่ายเงิน วางไว้ท้ายรถ แล้วกลับมาหยิบอีกชิ้น เราสามารถหยิบตะกร้าสินค้า ใส่ทุกอย่างที่ต้องการลงไป แล้วจ่ายเงิน ที่จุดชำระเงิน นี่คือวิธีการทำงานของบัฟเฟอร์: รวบรวมข้อมูลแล้วรับทุกอย่างแล้วเขียน แทนที่จะเขียนแต่ละส่วนแยกจากกัน
ตัวสร้างและวิธีการของคลาส BufferedWriter
ทีนี้มาดูคลาสBufferedWriter ให้ละเอียดยิ่งขึ้น มีตัวสร้างสองตัวสำหรับสร้างวัตถุ:
public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)
โดยที่ในตัวสร้างทั้งสองคือสตรีมที่จะเขียนถึงและszดังที่ได้กล่าวไปแล้วคือขนาดของบัฟเฟอร์
คลาสBufferedWriterมีหลายวิธีเช่นกัน เราจะตรวจสอบบางส่วนของพวกเขาอย่างใกล้ชิดในวันนี้:
เขียน (ถ่าน [] อาร์เรย์) | เขียน อาร์เรย์ ถ่านไปยังบัฟเฟอร์ |
เขียน (String s, int off, int len) | เขียนส่วนหนึ่งของสตริงไปยังบัฟเฟอร์ |
ต่อท้าย (ถ่าน c) | เขียนอักขระลงในบัฟเฟอร์ |
ต่อท้าย (CharSequence csq, int start, int end) | เขียนส่วนหนึ่งของอาร์เรย์ไปยังบัฟเฟอร์ |
สายใหม่() | เขียนตัวคั่นบรรทัด |
ล้าง () | ล้างกระแส |
มาเขียนโปรแกรมที่จะเขียนค่าลงในไฟล์ สำหรับนักเขียนพารามิเตอร์ เราจะผ่านโปรแกรมเขียนไฟล์ให้กับตัวสร้าง มันถูกใช้เพื่อเขียนไฟล์ข้อความและมีตัวสร้างหลายตัวเพื่อเริ่มต้นวัตถุ:
FileWriter(ไฟล์ไฟล์, บูลีนต่อท้าย)
FileWriter(FileDescriptor fd)
FileWriter(ชื่อไฟล์สตริง)
FileWriter(ชื่อไฟล์สตริง, บูลีนต่อท้าย)
สำหรับตัวอย่างของเรา เราจะใช้ตัวสร้างที่ใช้ชื่อไฟล์:
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message);
bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
รหัสของเราจะใช้ วิธี เขียน (String str)เพื่อเขียนstrไปยังไฟล์file.txt
มีวิธีอื่นในการเขียน:
-
เขียน(char[] array ) — ตัวแปรนี้ยอมรับและเขียนchar array;
-
write(String s, int off, int len) — ตัวแปรนี้ใช้สตริงs ; offset offซึ่งเป็นดัชนีของอักขระที่จะเริ่มเขียน และlenซึ่งเป็นความยาวของสตริง (สตริงย่อย) ที่จะเขียน
try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message, 0, 11);
bufferedWriter.flush();
} catch(IOException ex) {
System.out.println(ex.getMessage());
}
รหัสนี้จะเขียน "Hello, Amig" ลงในไฟล์ เนื่องจากเราบอกวิธีการเขียน 11 ตัวอักษรโดยเริ่มจากดัชนี 0
รหัสของเรายังมี บล็อก ทรัพยากรแบบลองด้วย :
try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))
ซึ่งหมายความว่า เมธอด close()ถูกเรียกใช้โดยอัตโนมัติใน mybufferedWriterวัตถุเนื่องจากใช้อินเทอร์เฟซ AutoCloseable
เมธอดflush()ในโค้ดใช้เพื่อล้างเอาต์พุตสตรีม โดยบังคับให้เขียนไบต์ที่บัฟเฟอร์ทั้งหมด การเขียนอาจไม่เกิดขึ้นหากไม่มีการเรียกนี้ เนื่องจากเป็นสิ่งที่บ่งชี้ว่าต้องล้างบัฟเฟอร์และต้องเขียนไบต์ที่บัฟเฟอร์
คลาสBufferedWriterยังมี เมธอด newLine()ที่เพิ่มบรรทัดใหม่ให้กับข้อความของเรา:
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.write(message, 0, 13);
bufferedWriter.newLine();
bufferedWriter.write(message, 15, 33);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
ในไฟล์ เราได้รับ:
นี่เป็นข้อความที่สำคัญมาก!
ลายเซ็นของ วิธี ผนวก ()มีลักษณะดังนี้:
public Writer append(CharSequence csq, int start, int end)
ใช้เพื่อเพิ่มcsq ในที่นี้startคือดัชนีของอักขระตัวแรก และendคือดัชนีของอักขระตัวสุดท้ายของสตริง (หรือสตริงย่อย) ที่จะแทรก ไม่ได้ใส่อักขระที่มีดัชนีสิ้นสุด
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
String message = "Hello, Amigo! This is a very important message!";
bufferedWriter.append(message, 0, 7);
bufferedWriter.flush();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
รหัสนี้จะให้คุณ:
นั่นคือ ด้วย วิธีการ ต่อท้ายคุณจะระบุส่วนใดของสตริงที่จะเพิ่มลงในบัฟเฟอร์
เมื่อพิจารณาถึงความแตกต่างระหว่างwrite()และappend() ให้ละเอียดยิ่งขึ้น ก่อนอื่นเราจะเห็นว่าทั้งคู่ทำสิ่งเดียวกันในหลักการ นั่นคือ พวกเขาเขียนค่าต่างๆ
อย่างไรก็ตาม ความแตกต่างคือ วิธีการ ต่อท้ายนั้นใหม่กว่าและใช้CharSequenceเป็นอาร์กิวเมนต์ และเนื่องจากStringใช้CharSequenceเราจึงสามารถส่งStringsและStringBuildersและStringBuffersไปยังวิธีการต่อท้าย ได้ แต่ เมธอด write()จะรับเฉพาะStringเท่านั้น
แค่นี้ก่อน! วันนี้เรามาทำความรู้จักกับบัฟเฟอร์ วิธีการเขียนบัฟเฟอร์ไปยังไฟล์ รวมถึงวิธีการต่างๆ ที่คุณสามารถใช้เพื่อทำสิ่งนี้