Lỗi Đọc Object từ FILE trong Java

Mình có 1 List chưa các object Sản Phẩm. Mình ghi object ra file sau đó hiển thị từ file ra Jtable trong java
Có dùng Seralizable và tostring nhưng ký tự đầu tiên vẫn bị mã hóa.
Bạn nào có kinh nghiệm chỉ giúp mình với. Mình cảm ơn
Anh @ltd pin giúp em lên 1 tối đc không ạ. Mai em phải nộp bài mất rồi
<img src="//daynhauhoc.s3-ap-southeast-1.amazonaws.com/original/2X/f/f33c51e26f51fea11aa8c839487d508a7d66327c.png" width=“690” height=“388”

Tại sao bạn phải dùng Serializable, toString() ở đây?
Nếu là write file or read file thì bạn nên chú ý thêm option UTF8.
Bạn có thể đưa code write,read file lên đấy mình check cho.

1 Like

Thêm option đó ở đâu bạn?
Đây là code ghi object ra file của mình

        LinkedList<Book> book  = new LinkedList<>();
 void AddBook() throws FileNotFoundException, IOException{
        Book b1 = new Book();
        b1.setbCode(txtcode.getText());
        b1.setTitle(txttitle.getText());
        b1.setQiantity(Integer.parseInt(txtQuantity.getText()));
        b1.setLended(Integer.parseInt(txtLended.getText()));
        b1.setPice(Double.parseDouble(txtPrice.getText()));
        book.add(b1);
        File f = new File("D:\\Documents\\Book.txt");
        FileOutputStream f1 = new FileOutputStream(f);
        ObjectOutputStream out = new ObjectOutputStream(f1);
        out.writeObject(b1.toString());
	out.close();
    }

bạn thay đoạn:

out.writeObject(b1.toString());

thành:

out.writeObject(b1);

Nếu dùng Serializable thì bạn write Object chứ không phải write String

Mà mình khuyên bạn nên write ra file dạng String, và đọc file cũng dạng String luôn, sau đó khởi tạo Object mới. Chứ không nên dùng Serializable.

Không như vậy nó sẽ bị mã hóa trong File. Lúc lấy dữ liệu từ file ra Jtable cũng bị mã hóa theo.
Bạn có cách nào lấy dữ liệu ra JTABLE không bị mã hóa ??

Haiz, hình như bạn không hiểu gì về Serializable thì phải :frowning: .
Bạn gửi tớ xem đoạn code Read file, với đoạn fill data cho JTABLE đi

1 Like

Write Object vào file

       File f = new File("D:\\Documents\\Book.txt");
        FileOutputStream f1 = new FileOutputStream(f);
        ObjectOutputStream out = new ObjectOutputStream(f1);
        out.writeObject(b1.toString());
	out.close();

Đọc ra Jtable

 private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        Vector col = new Vector();
        Vector data = new Vector();
        BufferedReader bin =null;
        try {
  
            bin = new BufferedReader(new FileReader("D:\\Documents\\Book.txt"));
            String st= null;
            while((st =bin.readLine()) != null){
                StringTokenizer stk = new StringTokenizer(st,"|");
                Vector temp = new Vector();
                while(stk.hasMoreElements()){
                    temp.add(stk.nextToken());
                }
                data.add(temp);
            }
            col.add("Book Code");
            col.add("Title");
            col.add("Quantity");
            col.add("Lended");
            col.add("Price");
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        tbData.setModel(new DefaultTableModel(data, col));
   }          

Cảm ơn bạn

File của mình bắt buộc ghi dưới dạng này
B07 | Biology | 11 | 0 | 12.2
B04 | Southern | 9 | 0 | 5.2

Hiểu rồi, bác thay hàm addBook bằng cách này nhé:

void AddBook() throws FileNotFoundException, IOException{
		String line = txtcode.getText();
		line += "|" + txttitle.getText();
		line += "|" + Integer.parseInt(txtQuantity.getText());
		line += "|" + Integer.parseInt(txtLended.getText());
		line += "|" + Double.parseDouble(txtPrice.getText());

		File file = new File("D:\\Documents\\Book.txt");
		FileWriter fileWritter = new FileWriter(file.getName(),true);
		BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
		bufferWritter.newLine();
		bufferWritter.write(line);
		bufferWritter.close();
	}

nhầm đoạn này:

FileWriter fileWritter = new FileWriter(file.getName(),true);

sửa lại:

FileWriter fileWritter = new FileWriter(file,true);

bác test lại nhé, tớ code chay nên không bảo đảm chạy ok. Nhưng ý tưởng là phải write file bình thường chứ không dùng Serializable để write Object

1 Like

Không được bạn ạ. Nó còn không ghi vào file luôn
Và bài này bắt buộc mình phải làm theo LinkedList. Vì còn các mục thêm sửa xóa tìm kiếm trong List như Menu trong Frame
Nếu chỉ in vào file như này thì rất khó để tìm và sửa

Tớ bị nhầm bác sửa lại chưa?
Tóm lại là có 2 cách:

  1. write file Object (dùng Serializable) thì phải đọc file bằng Object
  2. write file String, đọc file String -> cách này chắc chắn là cách bác sẽ làm.

Còn write file như thế nào thì bác tự tìm hiểu nhé, tớ code hộ đoạn trên rồi.

1 Like

Làm như này thì được nhưng
Mình bắt buộc phải dùng Linkedlist theo yêu cầu. Nó là object mà bạn?
Cảm ơn bạn đã giúp mình :smiley:

:frowning: vậy còn phải hướng dẫn tiếp hả bác :smiley: , giải thích vậy mà bác vẫn chưa hiểu vấn đề :smiley:
Haiz nốt vậy:

void AddBook() throws FileNotFoundException, IOException{
		Book b1 = new Book();
		b1.setbCode(txtcode.getText());
		b1.setTitle(txttitle.getText());
		b1.setQiantity(Integer.parseInt(txtQuantity.getText()));
		b1.setLended(Integer.parseInt(txtLended.getText()));
		b1.setPice(Double.parseDouble(txtPrice.getText()));
		book.add(b1);

		File file = new File("D:\\Documents\\Book.txt");
		FileWriter fileWritter = new FileWriter(file,true);
		BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
		bufferWritter.newLine();
		bufferWritter.write(b1.toString());
		bufferWritter.close();
	}
1 Like

Ừ, mình cũng làm thế này rồi. Cảm ơn bạn nhiều :smiley:
Có gì mình hỏi tiếp được không ạ. Phần File mình còn gà quá.

Bác cứ hỏi thoải mái hehe, mà tớ phải off rồi, 1 lúc nữa mới ol trả lời được

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