Tags:

Đọc file theo Object trong java

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

0 0 votes
Article Rating
Subscribe
Notify of
guest
5 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
5
0
Would love your thoughts, please comment.x
()
x