Mục lục
Khi đọc dữ liệu từ InputStream, đôi lúc chúng ta cần xem trước một vài byte khi đọc dữ liệu từ InputStream để xem có quyết định hướng đọc tiếp theo. PushbackInputStream cho phép bạn làm điều đó bằng cách cho phép bạn đẩy các byte đã được đọc ngược vào InputStream, những byte này sẽ được đọc ở những lần gọi read() sau.
PushbackInputStream input = new PushbackInputStream( new FileInputStream("c:\\data\\input.txt")); int data = input.read(); input.unread(data);
Khi chúng ta gọi read() thì một byte sẽ được đọc từ InputStream. unread() method đẩy byte vừa được đọc ngược lại InputStream, và như vậy ở lần gọi read() tiếp theo chúng ta sẽ được một byte như lần gọi trước. Nếu chúng ta đẩy nhiều byte cùng lúc vào InputStream thì byte được đọc cuối cùng sẽ được đẩy vào trước cứ như thế cho đến hết, về cơ bản nó hoạt động tương tự như Stack (vào sau ra trước)
Constructor PushbackInputStream
PushbackInputStream(InputStream in): Khởi tạo PushbackInputStream object cho phép tối đa 1 byte trả lại InputStream.
PushbackInputStream(InputStream in, int numBytes): Khởi tạo PushbackInputStream object với một mảng bộ nhớ đệm buffer có kích thước numBytes. Cho phép đẩy một mảng buffer về InputStream.
Ví dụ PushbackInputStream
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.PushbackInputStream; class PushbackInputStreamExample { public static void main(String arg[]) { String str = "Welcome to Shareprogramming.net "; byte b[] = str.getBytes(); try (ByteArrayInputStream bout = new ByteArrayInputStream(b); PushbackInputStream push = new PushbackInputStream(bout, 100)) { PrintWriter pw = new PrintWriter(System.out, true); int c; while ((c = push.read()) != -1) { pw.print((char) c); } pw.println(); // unread method push.unread(b); push.unread(b, 0, 7); while ((c = push.read()) != -1) { pw.print((char) c); } pw.println(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }
Output:
Welcome to Shareprogramming.net
WelcomeWelcome to Shareprogramming.net
Note: Nếu chúng ta sử dụng constructor PushbackInputStream(InputStream in) thì mặc định size buffer là 1, nếu chúng ta đẩy một mảng byte lớn hơn 1 về lại InputStream thì sẽ gây lỗi java.io.IOException: Push back buffer is full
Đọc dữ liệu trong PushbackInputStream
Để đọc dữ liệu trong PushbackInputStream chúng ta có đến 3 biến thể read() method với các nhiệm vụ khác nhau
- read() – Đọc từng tự từng byte
- read(byte[] buffer) – Đọc byte vào một mảng buffer được chỉ định tại tham số truyền vào.
- read(byte[] buffer, int off, int len) – Đọc byte vào mảng buffer được chỉ định trong tham số truyền vào bắt đầu ghi tại vị trí off và tối đa len byte.
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.PushbackInputStream; class PushbackInputStreamDemo { public static void main(String arg[]) throws IOException { String str = "Shareprogramming.net "; byte b[] = str.getBytes(); PrintWriter pw = new PrintWriter(System.out, true); try (ByteArrayInputStream bout = new ByteArrayInputStream(b); PushbackInputStream push = new PushbackInputStream(bout)) { int c; while ((c = push.read()) != -1) { pw.print((char) c); } pw.println(); push.read(b, 0, 16); for (int i = 0; i < 16; i++) { pw.print((char) b[i]); } pw.println(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }
Output
Shareprogramming.net
Shareprogramming
Đẩy dữ liệu trở lại InputStream
Có bao nhiêu cách đọc thì cũng tương ứng có bấy nhiêu cách đẩy dữ liệu trở lại InputStream
- unread() – Đẩy một byte được đọc cuối cùng vào InputStream
- unread(byte[] buffer) – Đẩy một mảng byte buffer vào lại InputStream
- unread(byte[] buffer, int off, int len) – Đẩy mảng byte con của buffer bắt đầu tại vị trí off và đối đa len byte.
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.PushbackInputStream; class PushbackInputStreamDemo { public static void main(String arg[]) { PrintWriter pw = new PrintWriter(System.out, true); String str = "Shareprogramming.net "; byte b[] = str.getBytes(); try ( ByteArrayInputStream bout = new ByteArrayInputStream(b); PushbackInputStream push = new PushbackInputStream(bout, 100)) { int c; while ((c = push.read()) != -1) { pw.print((char) c); } pw.println(); // unread method push.unread(b); push.unread(b, 0, 5); while ((c = push.read()) != -1) { pw.print((char) c); } pw.println(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }
Output
Shareprogramming.net
ShareShareprogramming.net
Đóng kết nối PushbackInputStream
Sử dụng close() method để đóng các kết nối giữa PushbackInputStream với các tài nguyên mà nó đang kết nối.
pushbackInputStream.close();
Kết luận
PushbackInputStream sẽ rất hữu dụng khi chúng ta có nhu cầu xem trước dữ liệu từ InputStream hoặc muốn đẩy các byte dữ liệu đã được đọc vào lại InputStream vì một lý do nào đó.
Nguồn tham khảo
https://www.geeksforgeeks.org/java-io-pushbackinputstream-class-java/
http://tutorials.jenkov.com/java-io/pushbackinputstream.html