30/09/2018, 23:37
Không ghi được Object vào File
Trong quá trình làm phương thức viết dữ liêu vào file nó bị báo lỗi , em cần lưu đối tượng vào flie . Em biết lỗi ở đó nhưng không biết sửa như thế nào mong mấy anh giúp đỡ.
@Override
public void writeToFile() {
Customer c = new Customer(ccode, cus_name); // bi loi o cho nay ne may anh.
try {
FileOutputStream fos = new FileOutputStream("A:\HK5\CSDL\test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(c);
oos.close();
fos.flush();
fos.close();
System.out.println("Save file successful!");
} catch (Exception ex) {
System.out.println(ex);
}
}
public Customer readFromFile() {
Customer c = new Customer();
try {
FileInputStream fis = new FileInputStream("A:\HK5\CSDL\test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
c = (Customer) obj;
} catch (Exception ex) {
System.out.println(ex);
}
return c;
}
Bài liên quan
Bạn đã implement Serializable cho class Customer chưa?
Em làm rồi anh , nó vẫn không lưu được.
Bạn up đoạn thông báo lỗi lên mình xem.
Error: java.io.NotSerializableException: java.util.Scanner
Error: at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at Assignment01.Customer.writeToFile(Customer.java:141)
at Assignment01.MainApp.main(MainApp.java:55)
Vì em không up class Customer nên anh đoán là trong đó có 1 field em sử dụng Scanner để input. Scanner không thể Serialization.
Dạ đúng rồi đó anh, em đang dùng Scanner để đễ nhập dữ liệu vào. Nếu vậy thì em phải làm sửa nó như thế nào hả anh
Có 2 cách:
1 : Em sửa khái báo biến Scanner bằng cách thêm từ khóa transient (tạm thời). Nó sẽ thông báo cái biến Scanner đó sẽ không được Serialization
2 : Đơn giản hơn là chỉ dùng nó như 1 biến local
Dạ cám ơn anh, mà khi em write to flie thì nó dữ liệu nó bị mã hóa hay sao ấy.
Ừ, vì em đã triển khai serializable
Oh thì ra là vậy, hihi . Vậy khi đọc dữ liệu từ file lên nó không hiển thị anh ơi.
Chắc em định hỏi nó có hiển thị đúng như cũ không? Có nhé. Đó là quá trình Deserialization
Dạ đúng rồi đó anh, em nghĩ nó sai ở dòng
Customer c = new Customer(); thì phải.
Up lỗi lên anh mới biết sai ở đâu chứ. Anh có thấy hết code của em đâu
Nó không có báo lỗi anh ah. Chỉ là không hiển thị được dữ liệu từ file thôi.
Em có làm gì đâu mà nó hiển thị. Em sửa lại code như này xem
Sau khi em làm xong, thì nó có đọc dữ liệu nhưng chỉ hiển thị dữ liệu cuối em nhập thôi.
Bởi vì mỗi lần em ghi/đọc object ra file code của em sẽ ghi lại object đó. Vì vây chỉ có thể đọc được 1 object cuối cùng.
Anh suggest 1 cách (chả hình dung ra từ tiếng việt nào cho dễ =)).
Em nên ghi và đọc object ra file theo List, ArrayList<'Customer>() hoặc gì đó.
Dạ đúng rồi đó anh. Hiện tại em đang làm Linked List nên không biết sử dụng nó như thế nào. Em gặp vấn đề đọc và ghi dữ liệu nên em đang tìm ra vấn đề.
Đây là code của em:
Trước khi anh chỉ em tiếp. Em nên Redesign(cấu trúc lại) class của em nhé.
Em không nên để hết tất cả vào 1 class như vậy
Nên làm theo mô hình MVC
Em xem code mẫu đọc file này. Anh viết ngay ở đây nên có thể sai cú pháp. Nhưng nội dung là đúng nhé
P/s: Anh phải đi nấu cơm :D. Ăn xong anh sẽ nói rõ hơn.
Cám ơn anh. Tại em đang làm bài tâp, yêu cầu bài tập là phải tự tạo Linked List không được sử dụng cái có sẵn, nên em không sử dụng ở trên có được không nữa