Mục lục
- 1 Ví dụ ObjectInputStream và ObjectOutputStream
- 2 Đóng kết nối trong ObjectInputStream và ObjectOutputStream
- 3 Kiểm tra số byte còn lại Object stream
- 4 Ghi object trong ObjectOutputStream
- 5 Đọc object trong ObjectInputStream
- 6 Đọc ghi các kiểu dữ liệu nguyên thủy trong Object stream
- 7 Các sử dụng ObjectInputStream và ObjectOutputStream
ObjectInputStream và ObjectOutputStream trong java cho phép chúng ta đọc ghi dữ liệu theo dạng object. Các byte dữ liệu thô sẽ được bao lại bên trong object và chuyển vào object stream.
Note: Các object được sử dụng trong Object stream phải implement Serializable.
Ví dụ ObjectInputStream và ObjectOutputStream
Chúng ta có class User implement Serializable
import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = -3389363800876569458L; private int id; private String name; public User(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "ID="+this.id+" NAME="+this.name; } }
class ObjectInputOutputStreamExample { public static void main(String[] args) { File file = new File("file.txt"); /* Write object and primitive data type to output stream */ FileOutputStream fileOutputStream = null; ObjectOutputStream outputStream = null; try { fileOutputStream = new FileOutputStream(file); outputStream = new ObjectOutputStream(fileOutputStream); // Write int value outputStream.writeInt(500); // Write date outputStream.writeObject(new Date()); // Write User object outputStream.writeObject(new User(1, "shareprogramming.net")); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fileOutputStream != null) { fileOutputStream.close(); } if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } /* Read object and primitive data type from input stream */ FileInputStream fileInputStream = null; ObjectInputStream objectInputStream = null; try { fileInputStream = new FileInputStream(file); objectInputStream = new ObjectInputStream(fileInputStream); // Read int int value = objectInputStream.readInt(); System.out.println(value); // Read date Date date = (Date) objectInputStream.readObject(); System.out.println(date); // Read User object User user = (User) objectInputStream.readObject(); System.out.println(user); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (fileInputStream != null) { fileInputStream.close(); } if (objectInputStream != null) { objectInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
Output:
500
Fri Jan 17 00:06:09 ICT 2020
ID=1 NAME=shareprogramming.net
Đoạn code trên chúng ta chia thành 2 phần:
- Phần 1: Ghi dữ liệu vào file.txt, mình đã ghi một số nguyên, một Date object, và một Person object theo đúng thứ tự trên.
- Phần 2: Đọc dữ liệu theo đúng thứ tự ghi mình có được kết quả như lúc ban đầu.
Đóng kết nối trong ObjectInputStream và ObjectOutputStream
Object stream cung cấp sẵn close() method để ngắt kết nối giữa object stream với các tài nguyên mà nó đang tham chiếu đến.
ObjectInputStream FileInputStream fileInputStream = new FileInputStream(new File("file.txt")); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); objectInputStream.close(); //ObjectOutputStream FileOutputStream fileOutputStream = new FileOutputStream(new File("file.txt")); ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream); outputStream.close();
Kiểm tra số byte còn lại Object stream
Sử dụng available() để kiểm tra còn bao nhiêu byte dữ liệu thô có thể đọc được từ object stream.
int bytes = objectInputStream.available(); int bytes = objectOutputStream.available();
Ghi object trong ObjectOutputStream
Sử dụng writeObject() để ghi object xuống object stream.
outputStream.writeObject(new Date());
Đọc object trong ObjectInputStream
Sử dụng readObject() để đọc object từ InputStream
Date date = (Date) objectInputStream.readObject();
Đọc ghi các kiểu dữ liệu nguyên thủy trong Object stream
Đối với việc đọc dữ liệu thì ObjectInputStream còn cung cấp cho chúng ta một số method giúp đọc các dữ liệu nguyên thủy cho chúng ta sử dụng mà không cần phải chuyển đổi kiểu dữ liệu.
- read(byte[], int off, int len) – Đọc dữ liệu vào mảng byte tại vị trí off tối đa len byte.
- readBoolean() – Đọc giá trị boolean.
- readByte() – Đọc giá trị byte.
- readChar() – Đọc giá trị char.
- readDouble() – Đọc giá trị double.
- readFloat() – Đọc giá trị float.
- readInt() – Đọc giá trị int.
- readLong() – Đọc giá trị long.
- readShort() – Đọc giá trị short.
ObjectOutputStream cũng cung cấp các method tương ứng để ghi các kiểu dữ liệu nguyên thủy xuống
- write(byte[], int off, int len) – Ghi dữ liệu vào mảng byte tại vị trí off tối đa len byte.
- writeBoolean(boolean val) – Ghi giá trị boolean.
- writeByte(byte b) – Ghi giá trị byte.
- writeChar(char c) – Ghi giá trị char.
- writeDouble(double d) – Ghi giá trị double.
- writeFloat(float f) – Ghi giá trị float.
- writeInt(int i) – Ghi giá trị int.
- writeLong(long l) – Ghi giá trị long.
- writeShort(short s) – Ghi giá trị short.
Các sử dụng ObjectInputStream và ObjectOutputStream
Việc đọc ghi theo object sẽ rất thuận lợi trong quá trình xử lý, vì thông thường các chương trình java sẽ thao tác với các object rất nhiều, đỡ tốn công chúng ta phải xây dựng lại object từ các dữ liệu thô.
Nói thì nói vậy chứ file dữ liệu gồm các object đâu ra mà cho chúng ta đọc ngon vậy! Thông thường thì ObjectOutputStream và ObjectInputStream sẽ được sử dụng chung với nhau, ObjectOutputStream sẽ ghi các object xuống file và ObjectInputStream dùng để đọc chúng lên. Các trường hợp dữ liệu thô thì bắt buộc chúng ta sẽ phải đọc theo byte, theo dòng etc.
Nguồn tham khảo
https://www.geeksforgeeks.org/java-io-objectinputstream-class-java-set-2/
http://tutorials.jenkov.com/java-io/objectinputstream.html