“ฉันอีกแล้วนะ”

“สวัสดี เอลลี่!”

"วันนี้ฉันอยากจะบอกคุณเกี่ยวกับBufferedReaderและBufferedWriter "

“คุณบอกฉันเกี่ยวกับพวกเขาแล้ว จริงๆ มันไม่ได้ซับซ้อนขนาดนั้น”

"ตกลง แล้วบอกฉันว่าBufferedReaderทำงานอย่างไร"

" BufferedReaderเปรียบเสมือนตัวแปลงไฟ 110/220V"

"คุณต้องส่งผ่านไปยังตัวสร้างBufferedReader ซึ่งเป็นวัตถุ Readerที่ข้อมูลจะถูกอ่าน วัตถุ BufferedReaderจะอ่านข้อมูลจำนวนมากจากReaderและจัดเก็บไว้ภายในในบัฟเฟอร์ นั่นเป็นสาเหตุที่การใช้ BufferedReader เพื่ออ่านจากReaderนั้นเร็วกว่า มากกว่าการอ่านจากเครื่องอ่าน โดยตรง "

"ถูกต้อง แล้วBufferedWriter ล่ะ ?"

"มันง่ายนิดเดียว สมมติว่าเราเขียนไฟล์ไปยังFileWriterข้อมูลจะถูกเขียนลงดิสก์ทันที ถ้าเราเขียนข้อมูลเล็กๆ น้อยๆ บ่อยๆ เราก็จะไปกระทบดิสก์มาก ซึ่งจะทำให้โปรแกรมทำงานช้าลงมาก แต่ถ้าเราใช้BufferedWriterเป็น 'ตัวแปลง' การดำเนินการเขียนจะเร็วขึ้นมาก เมื่อคุณเขียนไปยัง BufferedWriter มันจะบันทึกข้อมูลในบัฟเฟอร์ภายใน เมื่อบัฟเฟอร์เต็ม มันจะเขียนข้อมูลไปยังWriterเป็น ก้อนใหญ่ก้อนเดียว เร็วกว่ามาก"

“หืม จริงสิ แต่เธอลืมอะไรไปหรือเปล่า”

"หลังจากคุณเขียนเสร็จแล้ว คุณต้องเรียกใช้ เมธอด flush()บน วัตถุ BufferedWriterเพื่อบังคับให้ส่งข้อมูลใด ๆ ที่ยังอยู่ในบัฟเฟอร์ไปยังWriter "

"แล้วอะไรอีกล่ะ"

"อะไรอีกล่ะ โอ้! ตราบเท่าที่บัฟเฟอร์ไม่ได้ถูกเขียนไปยัง Writer ข้อมูลนั้นสามารถถูกลบและ/หรือแทนที่ได้"

"Amigo! ฉันประทับใจ! คุณเป็นผู้เชี่ยวชาญ! ถ้าอย่างนั้นฉันจะบอกคุณเกี่ยวกับคลาสใหม่:  ByteArrayStreamและPrintStream "

"ตัวอย่างเช่นByteArrayInputStreamและByteArrayOutputStream "

"คลาสเหล่านี้คล้ายกับStringReaderและStringWriterยกเว้นStringReaderอ่านอักขระ ( char ) จากสตริง ( String ) แต่InputStreamอ่านไบต์จากอาร์เรย์ไบต์ ( ByteArray )"

StringWriterเขียนอักขระ ( ถ่าน ) ลงในสตริง ในขณะที่ByteArrayOutputStreamเขียนไบต์ไปยังอาร์เรย์ไบต์ภายใน เมื่อคุณเขียนไปยังStringWriterสตริงภายในของสตริงจะยาวขึ้น และเมื่อคุณเขียนไปยังByteArrayOutputStreamอาร์เรย์ไบต์ภายในก็จะขยายแบบไดนามิกด้วย

"จำตัวอย่างที่คุณได้รับในบทเรียนที่แล้ว:"

การอ่านจากวัตถุตัวอ่านและการเขียนไปยังวัตถุตัวเขียน:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

"นี่คือลักษณะการทำงานหากใช้ไบต์แทนอักขระ:"

การอ่านจากวัตถุ InputStream และการเขียนไปยังวัตถุ OutputStream:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

"ทุกอย่างเหมือนกับในตัวอย่างข้างต้น ยกเว้น เราแทนที่ String ด้วย ByteArray, Reader ด้วย InputStream และ Writer ด้วย OutputStream"

"อีกเพียงสองขั้นตอนเท่านั้นคือการแปลงสตริงเป็น ByteArray และกลับมาอีกครั้ง อย่างที่คุณเห็น การดำเนินการนี้ค่อนข้างง่าย:"

การแปลงสตริงเป็น ByteArray และกลับมาอีกครั้ง
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

"หากต้องการรับไบต์ที่เพิ่มไปยัง ByteArrayOutputStream แล้ว ให้เรียกเมธอดtoByteArray ()"

"อา ความคล้ายคลึงกับ StringReader/StringWriter ค่อนข้างชัดเจน โดยเฉพาะอย่างยิ่งหลังจากที่คุณชี้ให้ฉันเห็น ขอบคุณ Ellie สำหรับบทเรียนที่น่าสนใจจริงๆ"

"คุณจะรีบไปไหน ฉันยังมีของขวัญเล็กๆ น้อยๆ ให้คุณ ฉันอยากจะบอกคุณเกี่ยวกับคลาส PrintStream"

"PrintStream? นั่นเป็นครั้งแรกที่ฉันได้ยินเกี่ยวกับคลาสนั้น"

"ใช่ โดยเฉพาะอย่างยิ่ง ถ้าคุณไม่นับว่าคุณใช้มันตั้งแต่วันแรกของการศึกษา Java คุณจำSystem.out ได้ ไหมSystem.outเป็นตัวแปร (คลาส) แบบคงที่ของSystemคลาสและประเภทของมันคือ... PrintStreamนี่คือที่มาของเมธอด print, println และอื่นๆ ทั้งหมด"

"ว้าว น่าสนใจจัง ฉันไม่เคยคิดแบบนั้นเลย บอกฉันมากกว่านี้สิ"

"ดี โอเค ฟังนะ คลาส PrintStream ถูกประดิษฐ์ขึ้นสำหรับเอาต์พุตที่อ่านได้ ประกอบด้วยเมธอด print และ println เกือบทั้งหมด ดูที่ตารางนี้:"

วิธีการ วิธีการ
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

"ยังมีวิธีการจัดรูปแบบหลายวิธี ดังนั้นคุณจึงสามารถส่งออกข้อมูลโดยใช้สตริงรูปแบบได้ ตัวอย่างเช่น:"

การแปลงสตริงเป็น ByteArray และกลับมาอีกครั้ง
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
เอาต์พุตหน้าจอ:
My name is Kolan. My age is 25.

"ใช่ ฉันจำได้ เราศึกษาเมธอดการจัดรูปแบบของคลาสสตริงแล้ว"

"นั่นคือทั้งหมดที่สำหรับตอนนี้."

“ขอบคุณนะเอลลี่”