Java: Buffered Stream
Phần lớn các ví dụ trong các bài viết về I/O tại V1Study là không sử dụng bộ đệm I/O. Điều này có nghĩa là từng thao tác đọc hoặc ghi được xử lý trực tiếp bởi hệ điều hành cơ bản, như vậy thì tính hiệu quả sẽ không cao, vì mỗi yêu cầu input và output thường phải truy cập vào đĩa, network, hoặc một số hoạt động khác, và hệ quả là chi phí sẽ tương đối cao.
Để giảm bớt chi phí, nền tảng Java sử dụng các stream bộ đệm I/O. Các stream bộ đệm input đọc dữ liệu từ một vùng bộ nhớ gọi là một bộ đệm; API input gốc chỉ được gọi khi bộ đệm trống. Tương tự như vậy, các stream bộ đệm output ghi dữ liệu vào bộ đệm, và các API output gốc chỉ được gọi khi bộ đệm đầy.
Một chương trình có thể chuyển đổi một không được đệm vào một stream đệm bằng cách sử dụng các gói sẵn có. Cụ thể, ở lớp CopyCharacters
có hai câu lệnh là:
inputStream = new FileReader ( "xanadu.txt");
outputStream = new FileWriter ( "characteroutput.txt");
, thì ta có thể sửa lại chúng thành như sau:
inputStream = new BufferedReader(new FileReader("input.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Có bốn lớp stream đệm dùng để bao các stream không đệm là: BufferedInputStream
và BufferedOutputStream
tạo byte stream đệm, còn BufferedReader
và BufferedWriter
tạo character stream đệm.
Xả bộ đệm
Một số lớp output đệm autoflush (xả tự động). Khi kích hoạt xả tự động thì một số sự kiện quan trọng sẽ được kích hoạt để tiến hành xả bộ đệm. Ví dụ, một đối tượng PrintWriter
xả tự động sẽ xả bộ đệm mỗi khi gọi phương thức println
hoặc format
.
Để xả thủ công thì ta gọi phương thức flush
. Phương thức flush
áp dụng được cho tất cả các output stream, tất nhiên nó chỉ có tác dụng khi stream được đệm.