[Java] Đọc ghi theo Object trong Java – Read Write Object in Java
Để đọc ghi theo Object trong Java thì tại class Object đó ta cần đặt giao tiếp java.io.Serializable
Một ví dự đơn giản đọc ghi 1 Object MyStudent như sau:
package VietSource.net.File; // cac ban nho thay package cho phu hop import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class ReadWriteObject { public static void main(String[] args){ MyStudent myStudent = new MyStudent(); // tao doi tuong myStudent //Ghi Object vao file try { // dat try cacth de tranh ngoai le khi tao va viet File FileOutputStream f = new FileOutputStream("student.dat"); // tao file f tro den student.dat ObjectOutputStream oStream = new ObjectOutputStream(f); // dung de ghi theo Object vao file f oStream.writeObject(myStudent); // ghi MyStudent theo kieu Object vao file oStream.close(); } catch (IOException e) { System.out.println("Error Write file"); } // doc Object tu file MyStudent ms = null; try { // dat try cacth de tranh ngoai le khi tao va doc File FileInputStream f = new FileInputStream("student.dat"); // tao file f tro den student.dat ObjectInputStream inStream = new ObjectInputStream(f); // dung de doc theo Object vao file f // dung inStream doc theo Object, ep kieu tra ve la MyStudent ms = (MyStudent) inStream.readObject(); inStream.close(); } catch (ClassNotFoundException e) { System.out.println("Class not found"); } catch (IOException e) { System.out.println("Error Read file"); } // Xuat KQ System.out.println("My name is " + ms.name + ". I am " + ms.age + " years old"); } } class MyStudent implements Serializable{ String name = "Nguyen Van Quan"; int age = 21; }
Kết quả: My name is Nguyen Van Quan. I am 21 years old
Lưu ý: Khi các bạn mở file student.dat ra thì sẽ thấy dữ liệu dạng như thế này: ��
Một ví dụ cụ thể hơn về cách đọc và ghi, trong ví dụ này có 1 class Student chứa các thuộc tính name và age và các phương thức get, set giá trị của chúng. Một class ProcessStudent gồm các phương thức cho phép nhập các student từ bàn phím, ghi các student vào file, đọc từ file theo kiểu Object và cuối cùng là hiển thị lại thông tin đọc được. Trong code đã giải thích khá rõ ràng:
package VietSource.net.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Scanner; public class IOFileObject_Student { public static void main(String args[]) throws Exception { ProcessStudent ps = new ProcessStudent(); // tao doi tuong cua lop ProcessStudent Student[] student1 = null, student2 = null; // tao 2 doi tuong student student1 = ps.creat(); // nhap student ps.write(student1); // viet vao file student2 = ps.read(); // doc tu file ps.show(student2); //hien thi kq } } class Student implements Serializable { // Serializable dung de ghi va doc theo Object private static final long serialVersionUID = 1L; // ID of Serializable private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // cac ham get, set gia tri cac bien public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // class xu ly thong tin class ProcessStudent { public Student[] creat() { // Input the data from Keyboard int n; Scanner scan = new Scanner(System.in); System.out.print("Enter number of student: "); n = Integer.parseInt(scan.nextLine()); //nhap so sinh vien Student[] student = new Student[n]; for (int i = 0; i < n; i++) { System.out.print("Enter name: "); // nhap ten sv thu i String name = scan.nextLine(); System.out.print("Enter age: "); // nhap tuoi int age = Integer.parseInt(scan.nextLine()); // tranh troi lenh nhu khi dung scan.nextInt() student[i] = new Student(name, age); // khoi tao doi tuong Student thu i } scan.close(); return student; } public void write(Student[] student) { //ghi theo Object try { // dat try cacth de tranh ngoai le khi tao va ghi File FileOutputStream f = new FileOutputStream("student.dat"); // tao file f tro den student.dat ObjectOutputStream oStream = new ObjectOutputStream(f); // dung de ghi theo Object vao file f oStream.writeObject(student); // ghi student theo kieu Object vao file oStream.close(); } catch (IOException e) { System.out.println("Error Write file"); } } public Student[] read() { // doc theo Object Student[] student = null; try { // dat try cacth de tranh ngoai le khi tao va doc File FileInputStream f = new FileInputStream("student.dat"); // tao file f tro den student.dat ObjectInputStream inStream = new ObjectInputStream(f); // dung de doc theo Object vao file f // dung inStream doc theo Object, ep kieu tra ve la Student student = (Student[]) inStream.readObject(); inStream.close(); } catch (ClassNotFoundException e) { System.out.println("Class not found"); } catch (IOException e) { System.out.println("Error Read file"); } return student; } public void show(Student[] student) throws Exception { //In data doc duoc tu file ra man hinh try { for (int i = 0; i < student.length; i++) { System.out.println((i + 1) + " : My name is " + student[i].getName() + ". I am " + student[i].getAge() + " years old"); } } catch (NullPointerException e) { System.out.println("File Empty"); } } }
Đọc thêm: Ghi thêm đối tượng vào file trong java
Cảm ơn bạn đọc code bạn rất dễ hiểu
Cảm ơn bạn đã quan tâm tới blog. Chúc bạn học tập tốt 😀
cảm ơn bạn rất nhiều !!!!! ^_^
Rất vui vì nó giúp được gì đó cho bạn. 🙂
Very thanks ! mình đang tìm hiểu . .
Ghé thăm Blog thường xuyên nhé,
Bài viết hay!, đúng đích. Tuy nhiên ở phần đóng luồng thì nên đặt ở finally .Như code trên của bạn thì giả sử sau try mà bị chết thì luồng sẽ không được đóng.
try{
//
}catch(Exception e){
}finally {
//close() stream;
}
Cảm ơn góp ý rất hữu ích của bạn.
Tuy nhiên như vậy lại phải try catch thêm 1 lần nữa hơi phức tạp nên mình không làm :). Muốn để cho nó đơn giản nhất có thể.
Cảm ơn a rất nhiều ạ.Nhờ bài của a mà e vỡ ra nhiều điều.Thanks so much !!!!!
Cho em hỏi là nếu làm với ArrayList thì làm thế nào ạ ?
ArrayList bạn có thể ghi thẳng cả list hoặc dùng for để ghi từng Object trong list vào file.
file student.dat ở thư mục nào hả anh?
Nó nằm ở thư mục project
Cảm ơn bài viết của cậu. Tớ có câu hỏi: tớ viết được lớp SinhVien.java, giờ muốn viết lớp Course.java chứa các sinh viên thì lớp Course làm như thế nào ?
Bạn làm y hệt sinh viên là đk
Cho em hỏi file gốc là file đuôi gì à .
em mở file .dat bằng Nodepad ra những kí tự rất lạ .
Chuẩn rồi. Ghi object thì nó thế mà. Có phải ghi text đâu mà đọc được bạn. Giống file exe, biết trong đó có gì đâu. Giờ bạn click chuột phải file exe bất kỳ rồi chọn open with notepad thì nó cũng vậy.
Bạn ơi cho mình hỏi.Vậy chỉ khi nào mình ghi object vào file thì mới cần phải implement class Serializable thôi đúng không bạn.Vậy thì khi mà lưu vào database có cần implement class Serializable không vì database là lưu từng colurm chứ không phải theo cả 1 object.Ngoài ra thì trong những trường hợp như nào thì mình phải implement class Serializable.Những trường hợp nào ko nên implement class Serializable.
Khi bạn lưu database thì ko cần.
Trong TH mình muốn nén nó lại để làm gì đó, như ghi vào file thế này
vậy làm sao biết thông tin ghi vào có đúng k?
Kiểm tra bằng cách đọc lại file 🙂
ví dụ như có đối tuong A và trong A có arrayList vậy thì khi đọc/write mảng dữ liệu kiểu B thì có thể đọc cho A được không ?
Mình chưa hiểu ý bạn lắm.
private static final long serialVersionUID = 1L;
Anh cho em hỏi hằng này nó dùng để làm gì ạ ? thiếu nó thì cảnh báo nhưng có rồi không biết sử dụng để làm gì.
Cái này anh cũng không biết, chưa tìm hiểu 🙂
Sao ko làm đọc ghi từng đối tượng đi ạ ????
Cái này dễ chứ cái kia e thấy phức tạp hơn ở phần đọc file đó ạ
Code rất rõ ràng và dễ hiểu. cảm ơn ad nhiều!!