โปรแกรมมักจะมีข้อกำหนดในการเขียนข้อมูลไปยังไฟล์หรือที่อื่นอย่างรวดเร็ว และสิ่งนี้ทำให้เกิดคำถาม: เราควรทำอย่างไร? เราควรเลือกเรียนคณะไหนดี? วันนี้เราจะทำความรู้จักกับผู้สมัครที่เหมาะสมสำหรับตำแหน่งนี้ — คลาส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(ไฟล์ไฟล์, บูลีนต่อท้าย)
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());
    }

ในไฟล์ เราได้รับ:

สวัสดี Amigo!
นี่เป็นข้อความที่สำคัญมาก!

ลายเซ็นของ วิธี ผนวก ()มีลักษณะดังนี้:

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เท่านั้น

แค่นี้ก่อน! วันนี้เรามาทำความรู้จักกับบัฟเฟอร์ วิธีการเขียนบัฟเฟอร์ไปยังไฟล์ รวมถึงวิธีการต่างๆ ที่คุณสามารถใช้เพื่อทำสิ่งนี้