Lớp ByteArrayOutputStream
(Class ByteArrayOutputStream)
Lớp ByteArrayOutputStream trong Java là một lớp được sử dụng để ghi dữ liệu vào một mảng byte có thể tự động mở rộng. Đây là một trong những lớp phổ biến trong java.io package và được sử dụng để thu thập dữ liệu đầu ra thành một mảng byte trước khi xử lý tiếp. Điều này khác với FileOutputStream khi mà dữ liệu được ghi trực tiếp vào một file trên đĩa.
Đặc điểm của Lớp ByteArrayOutputStream
↳ Tự động mở rộng: Khác với ByteArrayInputStream, ByteArrayOutputStream có khả năng tự động mở rộng kích thước bộ nhớ đệm (mảng byte) khi cần thiết. Khi dữ liệu mới được ghi vào và bộ nhớ đệm hiện tại không đủ lớn, nó sẽ tự động mở rộng để chứa dữ liệu mới.
↳ Ghi dữ liệu: Dữ liệu có thể được ghi vào ByteArrayOutputStream dưới dạng byte hoặc mảng byte. Khi bạn đã hoàn thành việc ghi, bạn có thể lấy mảng byte kết quả bằng cách sử dụng phương thức toByteArray() hoặc dưới dạng chuỗi bằng toString().
↳ Không cần đóng: Mặc dù ByteArrayOutputStream có phương thức close(), nhưng việc đóng nó là không cần thiết. Đóng ByteArrayOutputStream không có tác dụng thực tế nào, và bạn có thể tiếp tục sử dụng nó sau khi đã gọi close().
Khai báo lớp ByteArrayOutputStream trong Java
Để sử dụng lớp ByteArrayOutputStream, 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.ByteArrayOutputStream;
Cú pháp khai báo lớp ByteArrayInputStream:
Cú pháp
public class ByteArrayOutputStream extends OutputStream
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ public class ByteArrayOutputStream: Đây là khai báo một lớp công khai (public) tên là ByteArrayOutputStream. 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 ByteArrayOutputStream kế thừa từ lớp OutputStream. Điều này có nghĩa là ByteArrayOutputStream là một lớp con của OutputStream và kế thừa tất cả các phương thức và thuộc tính của OutputStream.
Các trường (fields) của Lớp ByteArrayOutputStream
Lớp ByteArrayOutputStream có hai trường được sử dụng để quản lý dữ liệu bên trong.
↳ protected byte[] buf: Mảng byte dùng để lưu trữ dữ liệu.
↳ protected int count: Số lượng byte hợp lệ trong bộ đệm.
Các constructor của Lớp ByteArrayOutputStream
Lớp ByteArrayOutputStream có hai constructor chính để tạo đối tượng
↳ ByteArrayOutputStream(): Tạo một đối tượng ByteArrayOutputStream mới với kích thước bộ đệm mặc định.
↳ ByteArrayOutputStream(int size): Tạo một đối tượng ByteArrayOutputStream mới với kích thước bộ đệm được chỉ định.
Các phương thức của lớp ByteArrayOutputStream
Các phương thức này cung cấp các cách khác nhau để tương tác với dữ liệu byte trong ByteArrayOutputStream. Bạn có thể đọc dữ liệu, viết dữ liệu, reset dữ liệu, chuyển đổi dữ liệu thành mảng byte hoặc chuỗi, và sao chép dữ liệu vào một luồng khác. Dưới đây là danh sách tất cả các phương thức của lớp ByteArrayOutputStream trong Java:
↳ void close(): Đóng luồng, nhưng không có tác dụng trong ByteArrayOutputStream.
↳ void reset(): Đặt lại bộ đếm nội bộ về 0, xóa bỏ dữ liệu đã ghi.
↳ int size(): Trả về kích thước hiện tại của bộ đệm.
↳ byte[] toByteArray(): Tạo một mảng byte mới chứa dữ liệu từ bộ đệm.
↳ String toString(): Chuyển đổi nội dung của bộ đệm thành một chuỗi sử dụng mã hóa mặc định của hệ thống.
↳ String toString(int hibyte): Đã lỗi thời, không nên sử dụng.
↳ String toString(String charsetName): Chuyển đổi nội dung của bộ đệm thành một chuỗi sử dụng mã hóa được chỉ định.
↳ String toString(Charset charset): Chuyển đổi nội dung của bộ đệm thành một chuỗi sử dụng mã hóa được chỉ định.
↳ void write(byte[] b, int off, int len): Viết len byte từ mảng byte b bắt đầu từ vị trí off vào luồng.
↳ void write(int b): Viết một byte vào luồng.
↳ void writeBytes(byte[] b): Viết toàn bộ nội dung của mảng byte b vào luồng.
↳ void writeTo(OutputStream out): Viết toàn bộ nội dung của luồng này vào luồng đầu ra được chỉ định.
Ví dụ 1
Dưới đây là một ví dụ đơn giản sử dụng ByteArrayOutputStream để ghi các byte vào bộ nhớ và sau đó chuyển đổi nội dung của nó thành mảng byte để in ra các ký tự.
Ví dụ: Example.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class Example {
public static void main(String[] args) {
// Tạo một đối tượng ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// Ghi các byte vào ByteArrayOutputStream
byteArrayOutputStream.write(65); // Ghi ký tự 'A'
byteArrayOutputStream.write(66); // Ghi ký tự 'B'
byteArrayOutputStream.write(67); // Ghi ký tự 'C'
// Chuyển đổi nội dung ByteArrayOutputStream thành mảng byte
byte[] byteArray = byteArrayOutputStream.toByteArray();
// In ra mảng byte dưới dạng ký tự
System.out.print("Các ký tự trong Mảng: ");
for (byte b : byteArray) {
System.out.print((char) b + " "); // Output: A B C
}
try {
// Đóng ByteArrayOutputStream
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Kết quả của chương trình là:
Trong ví dụ này, chúng ta tạo một ByteArrayOutputStream và ghi ba ký tự ('A', 'B', 'C') vào nó dưới dạng byte. Sau đó, chúng ta lấy dữ liệu đã ghi bằng phương thức toByteArray() và in ra các ký tự tương ứng.
Ví dụ 2
Dưới đây là một ví dụ khác về cách sử dụng ByteArrayOutputStream trong Java. Trong ví dụ này, chúng ta sẽ sử dụng ByteArrayOutputStream để xây dựng một chuỗi byte từ nhiều phần dữ liệu và sau đó chuyển đổi dữ liệu này thành chuỗi ký tự trước khi ghi nó vào một file.
Ví dụ: Example.java
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Example {
public static void main(String[] args) {
// Tạo một đối tượng ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
// Ghi dữ liệu vào ByteArrayOutputStream
byteArrayOutputStream.write("Hello, ".getBytes()); // Ghi chuỗi "Hello, "
byteArrayOutputStream.write("world!".getBytes()); // Ghi chuỗi "world!"
// Chuyển đổi nội dung ByteArrayOutputStream thành mảng byte
byte[] byteArray = byteArrayOutputStream.toByteArray();
// Tạo một FileOutputStream để ghi dữ liệu vào file
try (FileOutputStream fileOutputStream = new FileOutputStream("Example.txt")) {
// Ghi mảng byte vào file
fileOutputStream.write(byteArray);
}
System.out.println("Dữ liệu đã được ghi vào file Example.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// Đóng ByteArrayOutputStream
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Khi chương trình chạy, nội dung của file "Example.txt" sẽ là:
Khi nào sử dụng ByteArrayOutputStream?
↳ Khi bạn cần ghi dữ liệu tạm thời trước khi chuyển đổi thành mảng byte.
↳ Khi bạn cần xây dựng dữ liệu đầu ra từ nhiều nguồn khác nhau trước khi xử lý tiếp.
↳ ByteArrayOutputStream rất hữu ích trong các tình huống mà bạn không biết trước kích thước dữ liệu đầu ra hoặc khi bạn cần một vùng lưu trữ linh hoạt để tạm thời giữ dữ liệu.