!
%
(
$
+
%
%
)
%
9.3.6 I/O có lập vùng đệm
Vùng đệm là kho lưu trữ dữ liệu. Chúng ta có thể lấy dữ liệu từ vùng đệm thay vì quay trở
lại nguồn ban đầu của dữ liệu.
Java sử dụng cơ chế nhập/xuất có lập vùng đệm để tạm thời lập cache dữ liệu được đọc
hoặc ghi vào/ra một luồng. Nó giúp các chương trình đọc/ghi các lượng dữ liệu nhỏ mà
không tác động ngược lên khả năng thực hiện của hệ thống.
Trong khi thực hiện nhập có lập vùng đệm, số lượng byte lớn được đọc tại thời điểm này,
và lưu trữ trong một vùng đệm nhập. khi chương trình đọc luồng nhập, các byte dữ liệu
được đọc từ vùng đệm nhập.
Tiến trình lập vùng đệm kết xuất cũng thực hiện tương tự. khi dữ liệu được một chương
trình ghi ra một luồng, dữ liệu kết xuất được lưu trữ trong một vùng đệm xuất. Dữ liệu
được lưu trữ đến khi vùng đệm trở nên đầy hoặc các luồng kết xuất được xả trống. Cuối
cùng kết xuất có lập vùng đệm được chuyển gửi đến đích của luồng xuất.
Các bộ lọc hoạt động trên vùng đệm. Vùng đệm được phân bố nằm giữa chương trình và
đích của luồng có lập vùng đệm.
Lớp BufferedInputStream
Lớp này tự động tạo ra và chứa đựng vùng đệm để hỗ trợ vùng đệm nhập. Nhờ đó
chương trình có thể đọc dữ liệu từng luồng theo byte một mà không ảnh hưởng
đến khả năng thực hiện của hệ thống. Bởi lớp ‘BufferedInputStream’ là một bộ
lọc, nên có thể áp dụng nó cho một số đối tượng nhất định của lớp InputStream
và cũng có thể phối hợp với các tập tin đầu vào khác.
Lớp này sử dụng vài biến để thực hiện các cơ chế lập vùng đệm đầu vào. Các biến này
được khai báo là protected và do đó chương trình không thể truy cập trực tiếp. Lớp này
định nghĩa hai
phương thức thiết lập. Một cho phép chỉ định kích cỡ của vùng đệm nhập
trong khi đó phương thức thiết lập kia thì không. Nhưng cả hai phương thức thiết lập đều
tiếp nhận đối tượng của lớp InputStream và OutputStream làm đối số. lớp này chồng lên
các phương thức truy cập mà InputStream cung cấp và không làm nảy sinh bất kì phương
thức mới nào.
Lớp BufferedInputStream. Lớp này cũng định nghĩa hai phương thức thiết lập. nó cho phép
chỉ định kích cỡ của vùng đệm xuất trong một phương thức thiết lập cũng như cung cấp
một kích cỡ vùng đệm ngầm định. Nó chồng lên tất cả các phương thức của OutputStream
và không làm nẩy sinh bất kì phương thức nào.
Chương trình 9.3 dưới đây mô tả cách dùng các luồng nhập/xuất có lập vùng đệm:
Chương trình 9.3
import javaJang. * ;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.SequenceInputStream;
import java.io.IOException;
publicI class buff exam
{