Lớp FilterInputStream
(Class FilterInputStream)
FilterInputStream là một lớp trừu tượng kế thừa từ InputStream trong Java đóng vai trò như một lớp cơ sở cho các luồng đầu vào có chức năng lọc hoặc biến đổi dữ liệu. Nó chứa một luồng đầu vào cơ bản khác (underlying input stream) và chuyển tiếp các yêu cầu đọc dữ liệu đến luồng này.
Lớp FilterInputStream tự nó chỉ ghi đè tất cả các phương thức của InputStream bằng cách truyền tất cả các yêu cầu đến luồng đầu vào mà nó chứa. Các lớp con của FilterInputStream có thể ghi đè thêm một số phương thức này và cũng có thể cung cấp các phương thức và trường dữ liệu bổ sung để mở rộng chức năng. Điều này cho phép các lớp con tùy chỉnh cách dữ liệu được xử lý khi đọc từ luồng đầu vào.
Khai báo lớp FilterInputStream trong Java
Để sử dụng lớp FilterInputStream, bạn cần import gói java.io bạn cần thêm câu lệnh import vào đầu file Java của mình. Gói này cung cấp các lớp và giao diện để thực hiện các hoạt động nhập xuất (I/O) trong Java.
Cú pháp câu lệnh import:
Cú pháp
import java.io.FilterInputStream;
Cú pháp khai báo lớp FilterInputStream:
Cú pháp
public class FilterInputStream
extends InputStream
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ public class FilterInputStream: Đây là khai báo một lớp công khai (public) tên là FilterInputStream. Lớp này có thể được truy cập từ bất kỳ đâu trong dự án Java, miễn là nó được import hoặc ở cùng gói.
↳ extends InputStream: Lớp FilterInputStream kế thừa từ lớp InputStream. InputStream là một lớp cơ sở trừu tượng trong Java đại diện cho một luồng dữ liệu đầu vào. Nó cung cấp các phương thức để đọc dữ liệu từ một nguồn đầu vào (như file, mạng, v.v.).
Trường của lớp FilterInputStream
Lớp FilterInputStream có một trường duy nhất:
↳ protected InputStream in: Là một đối tượng InputStream được bảo vệ (protected). Đại diện cho luồng đầu vào cơ bản mà FilterInputStream sử dụng để đọc dữ liệu. Các phương thức của FilterInputStream thường chuyển tiếp các yêu cầu đọc dữ liệu đến in.
Lưu ý: Trường in không thể được truy cập trực tiếp từ bên ngoài lớp FilterInputStream. Các lớp con của FilterInputStream có thể sử dụng trường in để thực hiện các xử lý dữ liệu của riêng chúng.
Constructor của lớp FilterInputStream
Lớp FilterInputStream là một lớp trừu tượng, do đó không thể trực tiếp tạo đối tượng của nó. Tuy nhiên, nó cung cấp một constructor được đánh dấu protected:
↳ protected FilterInputStream(InputStream in): Constructor này được sử dụng bởi các lớp con để khởi tạo đối tượng FilterInputStream. Tham số in là một đối tượng InputStream đại diện cho luồng đầu vào cơ bản. Constructor gán in cho trường this.in để lưu trữ tham chiếu đến luồng đầu vào.
Lưu ý: Vì FilterInputStream là trừu tượng, bạn không thể sử dụng constructor này trực tiếp. Các lớp con của FilterInputStream phải sử dụng constructor này để khởi tạo đối tượng và cung cấp luồng đầu vào cơ bản.
Các phương thức của lớp FilterInputStream
Lớp FilterInputStream kế thừa một số phương thức từ lớp InputStream và thường chỉ chuyển tiếp các yêu cầu đến luồng đầu vào cơ bản. Dưới đây là danh sách tất cả các phương thức của lớp FilterInputStream trong Java:
↳ int read(): Đọc một byte từ luồng đầu vào.
↳ int read(byte[] b): Đọc một số lượng byte vào mảng b.
↳ int read(byte[] b, int off, int len): Đọc một số lượng byte vào mảng b bắt đầu từ vị trí off và có độ dài tối đa len.
↳ void close(): Đóng luồng đầu vào và giải phóng tài nguyên.
↳ void mark(int readlimit): Đánh dấu vị trí hiện tại trong luồng để có thể quay lại sau này.
↳ boolean markSupported(): Kiểm tra xem luồng có hỗ trợ đánh dấu hay không.
↳ void reset(): Quay lại vị trí đã được đánh dấu trước đó.
↳ long skip(long n): Bỏ qua một số lượng byte trong luồng.
↳ int available(): Trả về số lượng byte có thể đọc được mà không bị chặn.
Ví dụ
Dưới đây là một ví dụ đơn giản về cách sử dụng FilterInputStream thông qua một lớp con:
Ví dụ: Example.java
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.IOException;
class UpperCaseFilterInputStream extends FilterInputStream {
protected UpperCaseFilterInputStream(InputStream in) {
super(in);
}
@Override
public int read() throws IOException {
int c = super.read();
return (c == -1 ? c : Character.toUpperCase((char) c));
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int bytesRead = super.read(b, off, len);
for (int i = off; i < off + bytesRead; i++) {
b[i] = (byte) Character.toUpperCase((char) b[i]);
}
return bytesRead;
}
public static void main(String[] args) throws IOException {
String input = "Hello, World!";
try (InputStream in = new UpperCaseFilterInputStream(new java.io.ByteArrayInputStream(input.getBytes()))) {
int c;
while ((c = in.read()) != -1) {
System.out.print((char) c);
}
}
}
}
Kết quả của chương trình là:
Lớp FilterInputStream giúp mở rộng khả năng của các luồng đầu vào bằng cách cho phép bạn thực hiện các thao tác bổ sung khi đọc dữ liệu. Cho phép thêm các chức năng bổ sung hoặc xử lý dữ liệu đầu vào mà không thay đổi luồng đầu vào gốc.