30/09/2018, 18:32

Giúp mình Java I/O

Mình có tạo 1 ObjectOutputStream và ghi vào file dat 1 Vector rồi mình cũng viết luôn hàm đọc file lần chạy đầu tiên thì vẫn bình thường nhưng lần chạy 2 mình tạo thêm 1 phần tử rồi mình chạy thì kết quả vẫn hiện ra là kết quả của lần chạy thứ nhất mặc dù không xảy ra lỗi gì ai giúp m với Code :

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

public class NewClass {

public static void main(String[] args) {
    ghiFile();
    docFile();
}

public static void ghiFile() {
    Vector v = new Vector();
    v.add(1);
    v.add(2);
    v.add(3);
    v.add(5);
    try {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/aa.dat", true));
        oos.writeObject(v);
        oos.close();

    } catch (IOException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static void docFile() {
    Vector v = new Vector();
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/aa.dat"));
        v = (Vector) ois.readObject();
        ois.close();
    } catch (IOException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.println(v);
}

}

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

Vector v = new Vector();

Hình như Vector trong java cần thêm kiểu dữ liệu generic nữa thì phải.
Ví dụ

Vector<String> v = new Vector<>();
Nguyễn Hải Đăng viết 20:45 ngày 30/09/2018

Hình như Vector trong java cần thêm kiểu dữ liệu generic nữa thì phải.

Có thể không cần. Lí do là vấn đề compatibility giữa các bản JDK.

Nguyễn Hải Đăng viết 20:36 ngày 30/09/2018

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“E:/aa.dat”, true));

Dòng này bạn để append = true nghĩa là khi bạn ghi object mới vào file thì object đó sẽ được ghi vào tiếp sau object cũ. Bạn có thể test bằng cách chạy đi chạy lại chương trình sẽ thấy dung lượng file tăng lên rõ rệt

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/aa.dat"));

Dòng này chỉ đọc Object đầu tiên trong file, nên bạn vẫn thấy cái Object đầu tiên mà bạn ghi vào.

Nguyễn Văn Tuấn viết 20:46 ngày 30/09/2018

Thế có cách nào đọc hết không bạn

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

Mình nghĩ bạn không nên đọc thẳng vào kiểu dữ liệu là Vector mà nên dùng while để đọc lần lượt từng Object. Sau đó mới push vào vector.

Nguyễn Văn Tuấn viết 20:34 ngày 30/09/2018

M dùng while((v=ois.readObject)!=null) nhưng bị lỗi StreamCorruptedException

... viết 20:47 ngày 30/09/2018
public class StreamCorruptedException
extends ObjectStreamException

Thrown when control information that was read from an object stream violates internal consistency checks.

Bạn đọc như thế là bạn đọc vào cả Vector v rồi.
Bạn thử đọc từng object con rồi push vào Vector v ấy.

Nguyễn Văn Tuấn viết 20:42 ngày 30/09/2018

Bạn chỉ rõ cho mình tí được không mình dùng while rồi đọc bằng mảng Object rồi lấy Vector add cũng không được

Bài liên quan
0