Không ghi được Object vào File

Dạ cám ơn anh, mà khi em write to flie thì nó dữ liệu nó bị mã hóa hay sao ấy.

1 Like

Ừ, vì em đã triển khai serializable

1 Like

Oh thì ra là vậy, hihi :grinning:. 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

1 Like

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

1 Like

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);
        }
1 Like

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ì đó.

1 Like

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

  1. Class entity(Customer) chỉ chứa Constructor, get/set method + toString() or Equals()
  2. 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.

1 Like

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

1 Like

Em làm được rồi anh ah. Tks anh nhiều lắm.

1 Like

Để 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 :smiley:

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.

1 Like

A post was split to a new topic: Đọc dữ liệu sau khi đã lưu

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?