"Lại là ta."

"Chào, Ellie!"

"Hôm nay tôi muốn nói với các bạn tất cả về BufferedReaderBufferedWriter ."

"Bạn đã nói với tôi về chúng rồi. Chúng thực sự không phức tạp như vậy."

"OK. Vậy hãy cho tôi biết BufferedReader hoạt động như thế nào."

" BufferedReader giống như một bộ chuyển đổi 110/220V."

"Bạn phải chuyển tới hàm tạo BufferedReader đối tượng Reader mà dữ liệu sẽ được đọc từ đó. Đối tượng BufferedReader đọc các khối dữ liệu lớn từ Reader lưu trữ chúng bên trong bộ đệm. Đó là lý do tại sao sử dụng BufferedReader để đọc từ Reader nhanh hơn hơn là đọc trực tiếp từ Reader ."

"Đúng vậy. Còn BufferedWriter thì sao ?"

"Đó là một miếng bánh. Giả sử chúng ta ghi vào FileWriter . Dữ liệu được ghi vào đĩa ngay lập tức. Nếu chúng ta ghi các bit dữ liệu nhỏ thường xuyên, thì chúng ta sẽ chạm vào đĩa rất nhiều, điều này sẽ làm chậm chương trình rất nhiều. Nhưng nếu chúng ta sử dụng BufferedWriter làm 'bộ chuyển đổi', thì thao tác ghi sẽ nhanh hơn nhiều. Khi bạn ghi vào BufferedWriter , nó sẽ lưu dữ liệu vào bộ đệm bên trong. Khi bộ đệm đầy, nó sẽ ghi dữ liệu vào Writer dưới dạng một đoạn lớn duy nhất. Điều này nhanh hơn nhiều."

"Hừm. Nói ngay. Nhưng cậu quên gì rồi?"

"Sau khi bạn viết xong, bạn cần gọi phương thức flush() trên đối tượng BufferedWriter để buộc nó gửi bất kỳ dữ liệu nào còn trong bộ đệm tới Writer ."

"Và những gì khác?"

"Còn gì nữa? Ồ! Miễn là bộ đệm chưa được ghi vào Bộ ghi , dữ liệu có thể bị xóa và/hoặc thay thế."

"Anh bạn! Tôi rất ấn tượng! Bạn là một chuyên gia! Chà, sau đó tôi sẽ cho bạn biết về một số lớp mới:  ByteArrayStreamPrintStream ."

"Ví dụ: ByteArrayInputStreamByteArrayOutputStream ."

"Các lớp này hơi giống StringReaderStringWriter . Ngoại trừ StringReader đọc các ký tự ( char ) từ một chuỗi ( String ), nhưng InputStream đọc byte từ một mảng byte ( ByteArray ).

StringWriter ghi các ký tự ( char ) vào một chuỗi, trong khi ByteArrayOutputStream ghi byte vào một mảng byte bên trong. Khi bạn ghi vào StringWriter , chuỗi bên trong của nó sẽ dài hơn và khi bạn ghi vào ByteArrayOutputStream mảng byte bên trong của nó cũng tự động mở rộng.

"Hãy nhớ lại ví dụ mà bạn đã được đưa ra trong bài học trước:"

Đọc từ đối tượng người đọc và ghi vào đối tượng nhà văn:
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);
 }
}

"Đây là giao diện của nó nếu nó hoạt động bằng cách sử dụng byte thay vì ký tự:"

Đọc từ đối tượng InputStream và ghi vào đối tượng 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);
 }
}

"Mọi thứ đều giống như trong ví dụ trên. Ngoại trừ, chúng tôi đã thay Chuỗi bằng ByteArray, Trình đọc bằng InputStream và Trình ghi bằng OutputStream."

"Hai bước khác duy nhất là chuyển đổi Chuỗi thành ByteArray và ngược lại. Như bạn có thể thấy, điều này được thực hiện khá dễ dàng:"

Chuyển đổi Chuỗi thành ByteArray và ngược lại
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);
}

"Để lấy các byte đã được thêm vào ByteArrayOutputStream, hãy gọi phương thức toByteArray ()."

"À. Những điểm tương đồng với StringReader/StringWriter khá mạnh, đặc biệt là sau khi bạn chỉ ra cho tôi. Cảm ơn, Ellie, vì một bài học thực sự thú vị."

"Bạn đi đâu mà vội thế? Tôi vẫn còn một món quà nhỏ cho bạn. Tôi muốn nói với bạn về lớp PrintStream."

"PrintStream? Đó là lần đầu tiên tôi nghe nói về lớp học đó."

"Đúng. Đặc biệt, nếu bạn không tính đến việc bạn đã sử dụng nó từ ngày đầu tiên học Java. Bạn có nhớ System.out không? Chà, System.out là một biến (lớp) tĩnh của Hệ thống class, và kiểu của nó là... PrintStream ! Đây là nơi bắt nguồn của tất cả các phương thức print, println, v.v.."

"Chà. Thật thú vị. Bằng cách nào đó tôi thậm chí chưa bao giờ nghĩ đến điều đó. Hãy nói cho tôi biết thêm."

"Tốt. Được rồi, nghe này. Lớp PrintStream được tạo ra để có kết quả đầu ra có thể đọc được. Nó bao gồm gần như hoàn toàn các phương thức print và println. Hãy nhìn vào bảng này:"

phương pháp phương pháp
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)

"Cũng có một số phương thức định dạng để bạn có thể xuất dữ liệu bằng chuỗi định dạng. Ví dụ:"

Chuyển đổi Chuỗi thành ByteArray và ngược lại
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Đầu ra màn hình:
My name is Kolan. My age is 25.

"Ừ, tôi nhớ rồi. Chúng ta đã nghiên cứu phương thức định dạng của lớp String."

"Đó là tất cả cho bây giờ."

"Cảm ơn, Ellie."