Trong bài viết này, chúng ta sẽ tìm hiểu về lớp ByteArrayInputStream trong Java và các phương thức của nó cùng với sự trợ giúp của các ví dụ.
Lớp ByteArrayInputStream
Lớp ByteArrayInputStream của gói java.io có thể được sử dụng để đọc một mảng dữ liệu đầu vào (tính bằng byte). Nó kế thừa lớp trừu tượng InputStream.
Chú ý: Trong ByteArrayInputStream, luồng đầu vào được tạo bằng cách sử dụng mảng các byte. Nó bao gồm một mảng bên trong để lưu trữ dữ liệu của mảng các byte đó.
Tạo ByteArrayInputStream
Để tạo ByteArrayInputStream, trước tiên chúng ta phải thêm gói package java.io.ByteArrayInputStream. Sau khi thêm, đây là cách chúng ta có thể tạo luồng đầu vào.
1 |
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 vài dữ liệu nhất định từ mảng này.
1 |
ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr, int start, int length); |
Ở đây luồng đầu vào sẽ đọc số lượng các byte bằng giá trị length từ mảng đã có và bắt đầu từ vị trí start.
Các phương thức của ByteArrayInputStream
Lớp ByteArrayInputStream cung cấp các triển khai cho các phương thức khác nhau có trong lớp InputStream.
1. Phương thức read()
- Phương thức read(): Đọc một byte từ mảng có trong luồng đầu vào.
- Phương thức read(byte [] arr): Đọc số lượng các byte từ luồng đầu vào và lưu trữ trong mảng được chỉ định.
- Phương thức read(byte [] arr, int start, int length): Đọc số lượng các byte bằng giá trị length từ luồng và lưu trữ trong mảng được chỉ định bắt đầu từ vị trí start.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { byte[] du_lieu = {32, 41, 55, 26, 51}; try { ByteArrayInputStream input = new ByteArrayInputStream(du_lieu); for(int i= 0; i < du_lieu.length; i++) { int phan_tu = input.read(); System.out.print(phan_tu + " "); } input.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 |
32 41 55 26 51 |
Trong ví dụ trên, chúng ta đã tạo một luồng đầu vào mảng byte có tên là du_lieu.
1 |
ByteArrayInputStream input = new ByteArrayInputStream(du_lieu); |
Ở đâ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 ta đã sử dụng phương thức read().
2. Phương thức available()
Để có được số byte đang có trong luồng đầu vào, chúng ta có thể sử dụng phương thức available().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { byte[] du_lieu = {32, 41, 55, 26, 51}; try { ByteArrayInputStream input = new ByteArrayInputStream(du_lieu); System.out.println(input.available()); input.read(); System.out.println(input.available()); input.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 2 |
5 4 |
Trong ví dụ trên:
- Chúng ta đã sử dụng phương thức available() để kiểm tra số lượng byte đang có trong luồng đầu vào. Sau đó, chúng ta đã sử dụng phương thức read() 1 lần để đọc 1 byte từ luồng đầu vào.
- Sau khi đọc 1 byte, chúng ta đã kiểm tra các byte hiện có trong luồng. Lần này số byte giảm đi 1 (tức là ta đã đọc được 1 byte).
3. Phương thức skip()
Để loại bỏ và bỏ qua số lượng các byte được chỉ định, chúng ta có thể sử dụng phương thức skip().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { byte[] du_lieu = {32, 41, 55, 26, 51}; try { ByteArrayInputStream input = new ByteArrayInputStream(du_lieu); input.skip(3); int phan_tu = input.read(); while (phan_tu != -1) { System.out.print(phan_tu + " "); phan_tu = input.read(); } input.close(); } catch(Exception e) { e.getStackTrace(); } } } |
Kết quả:
1 |
26 51 |
Trong ví dụ trên, chúng ta đã sử dụng phương thức skip () để bỏ qua 3 byte dữ liệu từ luồng đầu vào. Do đó các giá trị trước giá trị 26 sẽ không được đọc.
4. Phương thức close()
Để đóng luồng đọc đầ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ó ảnh hưởng nào đến 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.
5. Các phương thức khác
Phương thức | Mô tả |
finalize() | Đảm bảo phương thức close() được gọi. |
mark() | Đánh dấu vị trí cho luồng đầu vào mà dữ liệu sẽ được đọc tới đó. |
reset() | Trả về control tại điểm trong luồng đầu vào mà đã được đánh dấu. |
markSupported() | Kiểm trả luồng đầu vào có hỗ trợ phương thức mark() và reset() hay không. |
Trên đây là khái niệm và ví dụ cơ bản về lớp ByteArrayInputStream trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài mới nhất trên tek4 nhé!
P/s: Cảm ơn mọi người!