CHƯƠNG 1 CÁC KHÁI NIỆM CƠ BẢN VỀ MẠNG MÁY TÍNH
2.3 Các dòng filter stream
2.3.2 Các lớp BufferedInputStream và BufferedOutputStream
Lớp BufferedOutputStream lưu trữ dữ liệu đã được ghi trong một vùng đệm (một mảng byte được bảo vệ có tên là buf) cho đến khi vùng đệm đầy hoặc dịng được đẩy đi. Sau đó lớp này sẽ ghi một lần tất cả dữ liệu vào output stream lớp dưới. Với cùng một số byte cần ghi lên một kết nối mạng, việc ghi một lần nhiều byte sẽ nhanh hơn nhiều việc ghi mỗi lần một byte do mỗi TCP segment hay mỗi gói UDP sẽ phải mang thêm một phần overhead đến 40 byte.
Lớp BufferedInputStream cũng có một mảng byte được bảo vệ có tên là buf, mảng này phục vụ như là một vùng đệm. Mỗi khi phương thức read() của
dòng được gọi, đầu tiên phương thức này sẽ cố gắng để tìm đọc các dữ liệu đã được yêu cầu từ vùng đệm. Chỉ khi vùng đệm khơng cịn dữ liệu thì dòng sẽ đọc dữ liệu từ các nguồn lớp dưới. Khi đó dịng sẽ đọc càng nhiều dữ liệu có thể được từ nguồn lớp dưới vào vùng đệm, cho dù dịng có thể cần hay khơng cần các dữ liệu này ngay tức thì. Các dữ liệu khơng được sử dụng ngay tức thì sẽ được sử dụng cho các lần gọi phương thức read() về sau. Sử dụng vùng đệm có thể cải thiện đáng kể hiệu
suất. BufferedInputStream và BufferedOutputStream đều có hai constructor: ¥! public BufferedInputStream(InputStream in)
¥! public BufferedInputStream(InputStream in, int bufferSize)
¥! public BufferedOutputStream(OutputStream out)
¥! public BufferedOutputStream(OutputStream out, int bufferSize)
Đối số thứ nhất là dòng lớp dưới mà từ dòng này các dữ liệu chưa được đưa vào vùng đệm sẽ được đọc hoặc các dữ liệu đã được đưa vào vùng đệm sẽ được ghi lên dịng lớp dưới này. Đối số thứ hai (nếu có) sẽ xác định số lượng byte trong vùng đệm, nếu khơng thì kích thước của vùng đệm sẽ được thiết lập bằng 2018 byte cho một input stream và bằng 512 byte cho một output stream. Kích thức lý tưởng cho một vùng đệm phụ thuộc vào kiểu của dòng mà ta đang đưa vào vùng đệm.
BufferedInputStream khơng có các phương thức riêng mà chỉ ghi đè (override) lên các phương thức của InputStream. BufferedInputStream hỗ trợ mark và reset.
BufferedOutputStream cũng khơng có các phương thức riêng. Ta có thể gọi
các phương thức của BufferedOutputStream giống như cách ta gọi các phương thức của bất kỳ output stream nào. Điểu khác biệt ở đây là phương thức write() trong BufferedOutputStream sẽ đặt dữ liệu trong một vùng đệm thay vì ghi trực tiếp xuống output stream lớp dưới. Do đó ta cần phải thực hiện đẩy dữ liệu ra khỏi vùng đệm bằng phương thức flush() tại thời điểm mà dữ liệu cần phải gửi đi.