Các lớp BufferedInputStream và BufferedOutputStream

Một phần của tài liệu Giáo trình lập trình mạng (Trang 35 - 36)

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. BufferedInputStreamBufferedOutputStream đề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.

Một phần của tài liệu Giáo trình lập trình mạng (Trang 35 - 36)

Tải bản đầy đủ (PDF)

(114 trang)