Mục lục
ByteArrayInputStream(BIS) và ByteArrayOutputStream(BOS) cung cấp chúng ta cơ chế đọc ghi dữ liệu dưới dạng mảng byte.
ByteArrayInputStream trong java
BIS bên trong vận hành một mảng byte buffer (byte[]) để lưu trữ mảng byte được cung cấp tại constructor của BIS. Ngoài ra có còn quản lý hai biến khác là pos và count. pos sử dụng để đánh dấu vị trí tiếp theo sẽ được đọc từ Input Stream trong khi count có giá trị bằng độ dài của mảng của mảng byte được truyền vào tại thời điểm khởi tạo, khi pos == count tất là các byte trong InputStream đã được đọc hết.
Constructor
//to 0 and count is length of bye bugger. public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } //BIS buf is initialized with byte buffer passed, pos is offset and count is minimum //of length of bye bugger or (offset + length). public ByteArrayInputStream(byte buf[], int offset, int length) { this.buf = buf; this.pos = offset; this.count = Math.min(offset + length, buf.length); this.mark = offset; }
Ví dụ ByteArrayInputStream
import java.io.*; class ByteArrayInputStreamExample { public static void main(String[] args) throws IOException { byte[] byteArray = { 97, 98, 99, 78, 71, 100 }; // pass byteArray input to InputStream handler InputStream is = new ByteArrayInputStream(byteArray); System.out.println("ByteStreamArray output"); handleInputStream(is); is.close(); } //generic method handling both FileInputStream and ByteInputStream private static void handleInputStream(InputStream is) { BufferedInputStream bis = new BufferedInputStream(is); // read each byte int readCount = 0; try { while ((readCount = bis.read()) != -1) { System.out.println((char)readCount); } } catch (IOException e) { e.printStackTrace(); } } }
Output:
ByteStreamArray output
a
b
c
N
G
d
ByteArrayOutputStream trong java
Bên trong BOS dùng mảng byte buffer(byte[] buffer) nơi chứa data ghi xuống. Mặc định kích thước của buffer là 32 và nó sẽ tự động tăng khi dữ liệu được ghi xuống ngày càng nhiều. Bạn cũng có thể thay đổi size của buffer bằng cách truyền size vào constructor.
constructor
public ByteArrayOutputStream(int size) { //byte buffer of length = size argument is created buf = new byte[size]; } public ByteArrayOutputStream() { //default size 32 byte buffer is created }
Ví dụ ByteArrayOutputStream
BOS thường được dùng để ghi dữ liệu chung xuống nhiều file.
import java.io.*; class ByteArrayOutputStreamExample { public static void main(String[] args) throws IOException { FileOutputStream fout1 = new FileOutputStream("f1.txt"); FileOutputStream fout2 = new FileOutputStream("f2.txt"); ByteArrayOutputStream bout = new ByteArrayOutputStream(); bout.write(65); bout.writeTo(fout1); bout.writeTo(fout2); bout.flush(); bout.close();// has no effect System.out.println("Success..."); } }
Sau khi chạy thành công thì chương trình sẽ tạo ra hai file f1.txt và f2.txt tại thư mục gốc của dự án và đều có cùng nội dung “A”.
Nguồn tham khảo: