Trong hướng dẫn này, chúng ta sẽ tìm hiểu về ByteArrayInputStream trong Java và các phương thức của nó với sự trợ giúp của các ví dụ.
lớp ByteArrayInputStream của gói java.io có thể được sử dụng để đọc một loạt các dữ liệu đầu vào (theo byte).
Nó mở rộng lớp InputStream trừu tượng.
![](https://cafedev.vn/wp-content/uploads/2021/02/cafedev-java-bytearrayinputstream.png)
Lưu ý : Trong ByteArrayInputStream, luồng đầu vào được tạo bằng cách sử dụng mảng byte. Nó bao gồm một mảng bên trong để lưu trữ dữ liệu của mảng byte cụ thể đó.
Nội dung chính
1. Tạo ByteArrayInputStream
Để tạo luồng đầu vào mảng byte, trước tiên chúng ta phải nhập gói java.io.ByteArrayInputStream. Sau khi chúng ta nhập gói, đây là cách chúng ta có thể tạo luồng đầu vào.
// Creates a ByteArrayInputStream that reads entire array
ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr);
Ở đây, chúng ta đã tạo một luồng đầu vào đọc toàn bộ dữ liệu từ mảng arr. Tuy nhiên, chúng ta cũng có thể tạo luồng đầu vào chỉ đọc một số dữ liệu từ mảng.
// Creates a ByteArrayInputStream that reads a portion of array
ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr, int start, int length);
Ở đây luồng đầu vào đọc số byte bằng chiều dài từ mảng bắt đầu từ khởi đầu Chức vụ.
2. Các phương thức của ByteArrayInputStream
lớp ByteArrayInputStream cung cấp triển khai cho các phương thức khác nhau trình bày trong lớp InputStream.
2.1 phương thức read()
- read() – đọc byte đơn từ mảng có trong luồng đầu vào
- read(byte[] array) – đọc các byte từ luồng đầu vào và lưu trữ trong mảng được chỉ định
- read(byte[] array, int start, int length) – đọc số byte bằng chiều dài từ luồng và lưu trữ trong mảng được chỉ định bắt đầu từ vị trí khởi đầu
2.2 Ví dụ: ByteArrayInputStream để đọc dữ liệu
import java.io.ByteArrayInputStream;
public class Main {
public static void main(String[] args) {
// Creates an array of byte
byte[] array = {1, 2, 3, 4};
try {
ByteArrayInputStream input = new ByteArrayInputStream(array);
System.out.print("The bytes read from the input stream: ");
for(int i= 0; i < array.length; i++) {
// Reads the bytes
int data = input.read();
System.out.print(data + ", ");
}
input.close();
}
catch(Exception e) {
e.getStackTrace();
}
}
}
Đầu ra
The bytes read from the input stream: 1, 2, 3, 4,
Trong ví dụ trên, chúng ta đã tạo một luồng đầu vào mảng byte có tên input.
ByteArrayInputStream input = new ByteArrayInputStream(array);
Ở đây, luồng đầu vào bao gồm tất cả dữ liệu từ mảng được chỉ định. Để đọc dữ liệu từ luồng đầu vào, chúng tôi đã sử dụng phương thức read().
2.3 phương thức available()
Để có được số byte có sẵn trong luồng đầu vào, chúng ta có thể sử dụng phương thức available(). Ví dụ,
import java.io.ByteArrayInputStream;
public class Main {
public static void main(String args[]) {
// Creates an array of bytes
byte[] array = { 1, 2, 3, 4 };
try {
ByteArrayInputStream input = new ByteArrayInputStream(array);
// Returns the available number of bytes
System.out.println("Available bytes at the beginning: " + input.available());
// Reads 2 bytes from the input stream
input.read();
input.read();
// Returns the available number of bytes
System.out.println("Available bytes at the end: " + input.available());
input.close();
}
catch (Exception e) {
e.getStackTrace();
}
}
}
Đầu ra
Available bytes at the beginning: 4
Available bytes at the end: 2
Trong ví dụ trên,
- Chúng tôi đã sử dụng phương thức available() để kiểm tra số lượng byte có sẵn trong luồng đầu vào.
- Sau đó, chúng tôi đã sử dụng phương thức read() 2 lần để đọc 2 byte từ luồng đầu vào.
- Bây giờ, sau khi đọc 2 byte, chúng tôi đã kiểm tra các byte có sẵn. Lần này số byte có sẵn giảm đi 2.
2.4 phương thức skip()
Để loại bỏ và bỏ qua số byte được chỉ định, chúng ta có thể sử dụng phương thức skip(). Ví dụ,
import java.io.ByteArrayInputStream;
public class Main {
public static void main(String args[]) {
// Create an array of bytes
byte[] array = { 1, 2, 3, 4 };
try {
ByteArrayInputStream input = new ByteArrayInputStream(array);
// Using the skip() method
input.skip(2);
System.out.print("Input stream after skipping 2 bytes: ");
int data = input.read();
while (data != -1) {
System.out.print(data + ", ");
data = input.read();
}
// close() method
input.close();
}
catch (Exception e) {
e.getStackTrace();
}
}
}
Đầu ra
Input stream after skipping 2 bytes: 3, 4,
Trong ví dụ trên, chúng tôi đã sử dụng phương thức jump() bỏ qua 2 byte dữ liệu từ luồng đầu vào. Vì thế 1 và 2 không được đọc từ luồng đầu vào.
2.5 phương thức close()
Để đóng luồng đầu vào, chúng ta có thể sử dụng phương thức close().
Tuy nhiên, phương thức close() không có hiệu lực trong lớp ByteArrayInputStream. Chúng ta có thể sử dụng các phương thức của lớp này ngay cả sau khi phương thức close() được gọi.
3. Các phương thức khác của ByteArrayInputStream
Phương thức | Mô tả |
finalize() | đảm bảo rằng phương thức close() được gọi |
mark() | đánh dấu vị trí trong luồng đầu vào mà dữ liệu đã được đọc |
reset() | trả lại điều khiển về điểm trong luồng đầu vào nơi đặt dấu |
markSupported() | kiểm tra xem luồng đầu vào có hỗ trợ mark() và reset() |
Để tìm hiểu thêm, hãy truy cập Java ByteArrayInputStream (tài liệu Java chính thức) .
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Java từ cơ bản tới nâng cao tại đây nha.
- Ebook về Java tại đây.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!