Dạ cám ơn anh, mà khi em write to flie thì nó dữ liệu nó bị mã hóa hay sao ấy.
Không ghi được Object vào File
Ừ, 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
Customer c;
try {
FileInputStream fis = new FileInputStream("A:\\HK5\\CSDL\\test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
c = (Customer ) ois.readObject();
System.out.println(c.toString());
ois.close();
} catch (Exception ex) {
System.out.println(ex);
}
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.
public void readFromFile() {
Customer c;
try {
FileInputStream fis = new FileInputStream("A:\\HK5\\CSDL\\test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
c = (Customer) ois.readObject();
System.out.println("-->" + "[" + cus.ccode + "," + cus.cus_name + "]");
} catch (Exception ex) {
System.out.println(ex);
}
}
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:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Scanner;
/**
*
* @author magen
*/
public class Customer implements ICusPro, Serializable { //inheriting interfaces ICusPro,Serializable
public String ccode;
public String cus_name;
Customer next; // reference to the subsequent node in the list
Customer head; // head node of the list
Customer tail; // tail node of the list
Customer cus; //Create a variable
transient Scanner sa = new Scanner(System.in);
public String getCcode() {
return ccode;
}
public void setCcode(String ccode) {
this.ccode = ccode;
}
public String getCus_name() {
return cus_name;
}
public void setCus_name(String cus_name) {
this.cus_name = cus_name;
}
public Customer() {
head = null;
tail = null;
}
public Customer(String id, String name) {
this.ccode = id;
this.cus_name = name;
}
public boolean isEmpty() {
return (head == null);
}
//Create new Customer
@Override
public void addNew() {
cus = new Customer(); //create a new element
System.out.print("Enter code: ");
this.ccode = sa.nextLine();
cus.setCcode(ccode);
System.out.print("Enter name: ");
this.cus_name = sa.nextLine();
cus.setCus_name(cus_name);
cus.next = head;
head = cus;
}
@Override
public void displayData() {
if (isEmpty()) { //List no elements
System.out.println("No elements on the list!");
} else {
Customer c = head;
while (c != null) {
System.out.print("-->" + "[" + c.ccode + "," + c.cus_name + "]");
c = c.next;
}
System.out.println("");
}
}
@Override
public void deleteByCode() { //Delete Customer by code
System.out.println("Enter code: ");
String code = sa.nextLine();
head = deleteByCode(head, code);
System.out.println("Delete successful!");
}
public Customer deleteByCode(Customer node, Object code) {
if (node == null) { //if node is null
return node;
} else if (node.ccode.equals(code)) { //test code equal node.code
return node.next;
} else {
node.next = deleteByCode(node.next, code);
}
return node;
}
@Override
public boolean searchByCode() {
if (head == null) {
return false;
} else {
System.out.println("Enter code: ");
Object code = sa.nextLine();
cus = head;
while (cus != null) {
if (cus.getCcode().equals(code)) {
System.out.println("Found: " + "-->" + "[" + cus.ccode + "," + cus.cus_name + "]");
return true;
}
cus = cus.next;
}
}
return false;
}
@Override
public void writeToFile() {
Customer c = new Customer(ccode, cus_name);
try {
FileOutputStream fos = new FileOutputStream("A:\\HK5\\CSDL\\test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(c);
oos.close();
fos.close();
System.out.println("Save file successful!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void readFromFile() {
try {
FileInputStream fis = new FileInputStream("A:\\HK5\\CSDL\\test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
cus = (Customer) ois.readObject();
System.out.println("-->" + "[" + cus.ccode + "," + cus.cus_name + "]");
ois.close();
} catch (Exception ex) {
System.out.println(ex);
}
}
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
- Class entity(Customer) chỉ chứa Constructor, get/set method + toString() or Equals()
- Các method read /write, search, delete nên để ra 1 class khác
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é
//method GetListCustomer() // đây là method readfile của em
Customer c = null; // tạo 1 object customer
LinkedList<Customer> customers = new .... // tạo 1 linkedlist lưu từng object khi đọc file
while ((c= (Customer )ois.readObject()) != null) {
customers .add(c);
}
return customers; // trả lisr về cho method ở dưới
//method display list customers
public void Display(LinkedList list){ // list này là return từ hàm trên
->> hiển thị list
}
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
Ở trên có cái nào có sẵn đâu?
Trong trường hợp bắt tự định nghĩa linkedlist thì em tạo 1 class LinkedList riêng. Và như thế cần tìm hiểu LinkedNote
Em làm được rồi anh ah. Tks anh nhiều lắm.
Để ghi tiếp Object vào File thì bạn dùng:
FileOutputStream f = new FileOutputStream("D:/file.txt", true);
Như vậy khi đọc lên sẻ không hiển thì Object cuối cùng.
Hãy cảm ơn mình bằng cách mark Solution, để những bạn gặp lỗi như em có thể tìm thấy giải pháp 1 cách nhanh nhất
Không phải đâu bạn. Do bạn ý tạo 1 biến để lưu trữ object khi đọc file mà không sử dụng loop hay List cho nên object sau sẽ Overwriting object trước. Dẫn đến chỉ hiển thị object cuối cùng trong file.
Còn
Nó thuộc Byte Stream trong Java được sử dụng để thực hiện input và output của các byte (8 bit). Không liên quan đến việc đọc lên không hiển thị object cuối cùng như bạn nói.