"Xin chào, Amigo! Hôm qua Rishi đã nói với bạn về FileInputStreamFileOutputStream . Và hôm nay tôi sẽ nói với bạn về các lớp FileReaderFileWriter ."

Như bạn có thể đã đoán, tất cả các lớp này là bộ điều hợp giữa đối tượng Tệp và các «giao diện» InputStream , OutputStream , ReaderWriter .

"Chúng tương tự như bộ điều hợp giữa Tệp và Trình đọc/Trình ghi, nhưng bạn chỉ cần chuyển một đối tượng Chuỗi cho hàm tạo chứ không phải Tệp!"

"Trên thực tế, chúng có một số hàm tạo. Có các hàm tạo cho cả đối tượng Tệp và Chuỗi. Nếu bạn chuyển một đối tượng Chuỗi cho hàm tạo, thì hàm tạo sẽ lặng lẽ tạo một đối tượng Tệp bằng cách sử dụng đường dẫn tệp được lấy từ đối tượng Chuỗi đã truyền."

Điều này là để thuận tiện. Những người tạo ra Java đã sử dụng các trường hợp sử dụng thường xuyên nhất cho các lớp này và viết các hàm tạo cho tất cả chúng. Điều đó khá thuận tiện, bạn có nghĩ vậy không?

"Ồ, vâng. Thuận tiện. Tôi đồng ý. Nhưng tại sao sau đó tôi phải liên tục viết:"
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
"Tại sao họ không thêm trường hợp sử dụng này?"

"Vấn đề ở đây là một   chương trình Java điển hình không hoạt động với bảng điều khiển. Thực tế là bạn hầu như không bao giờ đọc bất cứ thứ gì từ nó. Ngay cả với máy chủ web, máy chủ ứng dụng hoặc một số hệ thống phức tạp khác."

Nhưng chúng tôi có PrintStream để xuất dữ liệu và văn bản ra bàn điều khiển. Bởi vì các «ứng dụng máy chủ» này thường sử dụng bảng điều khiển để hiển thị trạng thái, lỗi và tất cả các loại thông tin khác của chúng.

"Hiểu rồi. Và bạn cũng có thể sao chép một tệp bằng FileReader và FileWriter?"

"Có, nếu đó là một tệp văn bản (nghĩa là nó bao gồm các ký tự). Đây là một ví dụ:"

Sao chép một tập tin trên đĩa
public static void main(String[] args) throws Exception
{
 FileReader reader = new FileReader("c:/data.txt");
 FileWriter writer = new FileWriter("c:/result.txt");

 while (reader.ready()) //as long as there are unread bytes in the input stream
 {
  int data = reader.read(); //Read one character (the char will be widened to an int)
  writer.write(data); //Write one character (the int will be truncated/narrowed to a char)
 }

 //Close the streams after we done using them
 reader.close();
 writer.close();
}

"Hầu như không có khác biệt."

"Vâng, sự khác biệt là tối thiểu."