Ghi thêm đối tượng (Object) vào file trong Java

Trong những bài viết trước, chúng ta đã tìm hiểu cách đọc đối tượng từ file, cách ghi đối tượng vào file trong Java.

Khi ghi đối tượng vào file theo cách ở bài trước, chúng ta chỉ được phép ghi 1 và chỉ 1 đối tượng vào file mà thôi. Nếu muốn ghi nhiều đối tượng vào file thì phải đưa tất cả các đối tượng đó vào trong 1 List (Hoặc ArrayList) rồi mới ghi file. Điều đó khá bất tiện.

Nhớ lại, khi ghi dữ liệu text vào file, bạn có thể sử dụng đoạn code bên dưới để có thể ghi thêm dữ liệu vào cuối file hiện có. (chú ý tham số true ở constructor lớp FileOutputStream)

FileOutputStream f = new FileOutputStream(fileName, true);

Tuy nhiên, với việc ghi đối tượng, nếu chỉ thực hiện như trên thì vẫn chưa đủ. Bạn phải ghi đè (override) thêm phương thức writeStreamHeader() của lớp ObjectOutputStream như sau:

ObjectOutputStream oStream = new ObjectOutputStream(f) {
    protected void writeStreamHeader() throws IOException {
        reset();
    }
};

Ví dụ hoàn chỉnh ghi thêm đối tượng (Object) vào file

Trong ví dụ này, chúng ta định nghĩa 2 class: DiemThiReadWriteObject

+ DiemThi: Định nghĩa cho đối tượng cần ghi vào file

+ ReadWriteObject: Định nghĩa các phương thức đọc, ghi (read(), write()) và kiểm tra file đã có đối tượng nào hay chưa (hasObject())

package com.ngockhuong;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ReadWriteObject {

	public void write(DiemThi diemThi, String filePath) {
		FileOutputStream fout = null;
		ObjectOutputStream oos = null;
		try {
			// nếu file chưa lưu object nào thì ghi bình thường
			if (!hasObject(filePath)) {
				fout = new FileOutputStream(filePath);
				oos = new ObjectOutputStream(fout);
			} else {
				fout = new FileOutputStream(filePath, true);
				oos = new ObjectOutputStream(fout) {
					@Override
					protected void writeStreamHeader() throws IOException {
						reset();
					}
				};
			}

			oos.writeObject(diemThi);
			System.out.println("Xong!");
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (fout != null) {
				try {
					fout.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (oos != null) {
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	// đọc object từ file
	public void read(String filePath) {
		FileInputStream fis = null;
		ObjectInputStream inStream = null;
		try {
			fis = new FileInputStream(filePath);
			inStream = new ObjectInputStream(fis);
			Object s;
			int i = 0;
			while (true) {
				s = inStream.readObject();
				System.out.println(++i + ": " + s.toString());
			}
		} catch (ClassNotFoundException e) {
		} catch (IOException e) {
		} finally {
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (inStream != null) {
				try {
					inStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}
	}

	// kiểm tra file có object lưu vào hay chưa
	public boolean hasObject(String filePath) {
		FileInputStream fi;
		boolean check = true;
		try {
			fi = new FileInputStream(filePath);
			ObjectInputStream inStream = new ObjectInputStream(fi);
			if (inStream.readObject() == null) {
				check = false;
			}
			inStream.close();
		} catch (FileNotFoundException e) {
			check = false;
		} catch (IOException e) {
			check = false;
		} catch (ClassNotFoundException e) {
			check = false;
			e.printStackTrace();
		}
		return check;
	}

	public static void main(String[] args) {
		ReadWriteObject obj = new ReadWriteObject();
		String filePath = "diemthi.bin";
		// ghi điểm cho học viên 1
		obj.write(new DiemThi("Lâm Ngọc Khương", 8), filePath);

		// ghi tiếp điểm cho học viên 2
		obj.write(new DiemThi("Lương Ngọc Khâm", 9), filePath);

		obj.read(filePath);
	}
}

class DiemThi implements Serializable {

	private static final long serialVersionUID = 1L;

	private String hoTen;
	private float diemTrungBinh;

	public DiemThi() {
	}

	public DiemThi(String hoTen, float diemTrungBinh) {
		this.hoTen = hoTen;
		this.diemTrungBinh = diemTrungBinh;
	}

	@Override
	public String toString() {
		return "DiemThi [hoTen=" + hoTen + ", diemTrungBinh=" + diemTrungBinh + "]";
	}

}
[alert-warning]

Lưu ý

Phương thức hasObject() rất quan trọng, nếu bạn không dùng hasObject() để kiểm tra file có dữ liệu hay chưa thì khi sử dụng đoạn code ghi thêm đối tượng, chương trình sẽ bắn ra lỗi ngay.

[/alert-warning]
5 1 vote
Đánh giá bài viết
Nhận thông báo
Thông báo khi có
guest

1 Bình luận
cũ nhất
mới nhất vote nhiều nhất
Phản hồi nội tuyến
Xem tất cả các bình luận
đinh thanh mimh

nếu như mình ghi đối tượng bị trùng thì ssao hả ad có cách nào để kiểm tra xem mình đã ghi trùng đối tượng không