Lớp Trừu Tượng InputStream (Abstract Class InputStream)
InputStream là một lớp trừu tượng cơ bản trong Java đại diện cho một luồng dữ liệu đầu vào, cho phép bạn đọc dữ liệu từ nhiều nguồn khác nhau. Nó cung cấp một giao diện chung cho việc đọc dữ liệu, bất kể nguồn dữ liệu là gì - có thể là một file, mảng byte, thiết bị ngoại vi, hoặc bất kỳ nguồn nào khác.
Cú pháp khai báo lớp trừu tượng InputStream:
Cú pháp
public abstract class InputStream
extends Object
implements Closeable
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ public: Lớp InputStream có phạm vi truy cập public, nghĩa là nó có thể được truy cập từ bất kỳ đâu trong chương trình.
↳ abstract: Đây là một lớp trừu tượng, có nghĩa là nó không thể được khởi tạo trực tiếp mà chỉ có thể được mở rộng (extend) bởi các lớp con. Lớp này chứa các phương thức trừu tượng mà các lớp con phải triển khai để cung cấp các chức năng cụ thể.
↳ class InputStream: Đây là tên của lớp. InputStream là một phần của gói java.io và được sử dụng để đọc dữ liệu từ nhiều nguồn khác nhau như tệp, mảng byte, hoặc kết nối mạng.
↳ extends Object: InputStream kế thừa từ lớp Object, là lớp cơ sở của tất cả các lớp trong Java. Điều này có nghĩa là InputStream thừa hưởng các phương thức cơ bản của lớp Object, chẳng hạn như toString(), equals(), và hashCode().
↳ implements Closeable: Lớp InputStream thực thi giao diện Closeable, nghĩa là nó có phương thức close(), giúp đóng luồng và giải phóng tài nguyên hệ thống. Khi sử dụng InputStream, bạn nên gọi close() để đảm bảo không có rò rỉ tài nguyên. Điều này cũng giúp hỗ trợ try-with-resources, tự động đóng luồng khi khối try kết thúc.
Các phương thức lớp trừu tượng InputStream
Các phương thức của lớp InputStream trong Java cung cấp các chức năng cơ bản để đọc dữ liệu từ một luồng đầu vào, từ việc đọc một byte đơn lẻ đến việc đọc toàn bộ luồng. Ngoài ra, còn có các phương thức để đánh dấu vị trí trong luồng, bỏ qua dữ liệu và chuyển dữ liệu sang một luồng đầu ra khác. Dưới đây là danh sách tất cả các phương thức của lớp InputStream trong Java:
↳ int available(): Trả về ước tính số byte có thể đọc được từ luồng đầu vào mà không bị chặn.
↳ void close(): Đóng luồng đầu vào và giải phóng tài nguyên liên quan.
↳ void mark(int readlimit): Đánh dấu vị trí hiện tại trong luồng đầu vào.
↳ boolean markSupported(): Kiểm tra xem luồng đầu vào có hỗ trợ phương thức mark và reset hay không.
↳ static InputStream nullInputStream(): Trả về một luồng đầu vào không đọc được bất kỳ byte nào.
↳ abstract int read(): Đọc một byte dữ liệu từ luồng đầu vào và trả về nó dưới dạng một số nguyên. Nếu đã đến cuối luồng, trả về -1.
↳ int read(byte[] b): Đọc một số byte từ luồng đầu vào và lưu trữ chúng vào mảng byte b.
↳ int read(byte[] b, int off, int len): Đọc tối đa len byte dữ liệu từ luồng đầu vào vào mảng byte b, bắt đầu từ vị trí off.
↳ byte[] readAllBytes(): Đọc tất cả các byte còn lại từ luồng đầu vào.
↳ int readNBytes(byte[] b, int off, int len): Đọc đúng số lượng byte được yêu cầu từ luồng đầu vào vào mảng byte đã cho.
↳ byte[] readNBytes(int len): Đọc tối đa số lượng byte được chỉ định từ luồng đầu vào.
↳ void reset(): Đặt lại vị trí của luồng đầu vào về vị trí được đánh dấu trước đó.
↳ long skip(long n): Bỏ qua và loại bỏ n byte dữ liệu từ luồng đầu vào.
↳ long transferTo(OutputStream out): Đọc tất cả các byte từ luồng đầu vào này và ghi các byte vào luồng đầu ra được cho theo thứ tự chúng được đọc.
Các lớp con kế thừa trực tiếp từ lớp trừu tượng InputStream trong Java
Các lớp con của InputStream mở rộng khả năng đọc dữ liệu từ nhiều nguồn khác nhau, mang lại sự linh hoạt trong việc xử lý đầu vào. Tùy thuộc vào nhu cầu của ứng dụng, bạn có thể chọn lớp con phù hợp để thực hiện các thao tác đọc dữ liệu. Dưới đây là danh sách các lớp con trực tiếp và các lớp liên quan đến InputStream, kèm theo mô tả ngắn gọn về từng lớp:
↳ AudioInputStream: Một lớp đặc biệt được sử dụng để đọc dữ liệu âm thanh. Nó mở rộng từ InputStream và thuộc về gói javax.sound.sampled, được thiết kế để xử lý các định dạng âm thanh trong Java.
↳ ByteArrayInputStream: Cho phép đọc dữ liệu từ một mảng byte trong bộ nhớ. Điều này hữu ích khi dữ liệu đã được lưu trữ sẵn trong bộ nhớ và cần được xử lý như một luồng đầu vào.
↳ FileInputStream: Được sử dụng để đọc dữ liệu từ một file trên hệ thống tập tin. Đây là cách phổ biến để lấy dữ liệu từ các file đã lưu trữ.
↳ FilterInputStream: Lớp cơ sở cho các luồng đầu vào có tính năng lọc (filtering). Các lớp con của FilterInputStream thêm các chức năng bổ sung trong quá trình đọc dữ liệu.
↳ BufferedInputStream: Sử dụng bộ đệm để tăng hiệu suất đọc dữ liệu, giúp giảm số lần truy cập trực tiếp vào nguồn dữ liệu.
↳ DataInputStream: Hỗ trợ đọc các kiểu dữ liệu nguyên thủy (như int, float, long, v.v.) từ luồng đầu vào, đảm bảo rằng dữ liệu được đọc theo định dạng chính xác và nhất quán với cách nó được ghi bằng DataOutputStream.
↳ PushbackInputStream: Cho phép "đẩy ngược" byte đã đọc lại vào luồng, để có thể đọc lại byte đó sau. Điều này hữu ích khi cần phải kiểm tra dữ liệu trước khi thực sự xử lý nó.
↳ ObjectInputStream: Cho phép đọc các đối tượng Java đã được tuần tự hóa (serialization) từ luồng đầu vào. Điều này rất hữu ích khi cần khôi phục trạng thái của các đối tượng từ lưu trữ hoặc truyền tải qua mạng.
↳ PipedInputStream: Đọc dữ liệu từ một luồng ống (pipe), thường được sử dụng để truyền dữ liệu giữa các luồng (threads) trong cùng một ứng dụng. Dữ liệu được đọc từ PipedInputStream được ghi bởi PipedOutputStream trong một luồng khác.
↳ SequenceInputStream: Một lớp đặc biệt cho phép kết hợp nhiều luồng đầu vào (InputStream) lại thành một luồng duy nhất. Nó đọc dữ liệu lần lượt từ mỗi luồng đầu vào trong một chuỗi (sequence).
↳ StringBufferInputStream: Đọc dữ liệu từ StringBuffer (Đã lỗi thời).
