30/09/2018, 18:15

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”

Cương Nguyễn viết 20:18 ngày 30/09/2018

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.

LoveJav viết 20:22 ngày 30/09/2018

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();
    }
Cương Nguyễn viết 20:15 ngày 30/09/2018

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

Cương Nguyễn viết 20:18 ngày 30/09/2018

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.

LoveJav viết 20:16 ngày 30/09/2018

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 ??

Cương Nguyễn viết 20:27 ngày 30/09/2018

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

LoveJav viết 20:24 ngày 30/09/2018

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

LoveJav viết 20:22 ngày 30/09/2018

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

Cương Nguyễn viết 20:19 ngày 30/09/2018

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();
	}
Cương Nguyễn viết 20:22 ngày 30/09/2018

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

LoveJav viết 20:29 ngày 30/09/2018

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

Cương Nguyễn viết 20:26 ngày 30/09/2018

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.

LoveJav viết 20:30 ngày 30/09/2018

FileWriter fileWritter = new FileWriter(file,true);

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

Cương Nguyễn viết 20:19 ngày 30/09/2018

vậy còn phải hướng dẫn tiếp hả bác , giải thích vậy mà bác vẫn chưa hiểu vấn đề
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();
	}
LoveJav viết 20:20 ngày 30/09/2018

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

Cương Nguyễn viết 20:32 ngày 30/09/2018

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

Bài liên quan
0