无法将对象写入 java 中的文件

Cannot write object to file in java

我有两个class:

public abstract class GiaoDich{
 //variable and set/get method
    public abstract double calcualteMoney();
}

public class GiaoDichDat extends GiaoDich implements Serializable {
    public static List<GiaoDichDat> listGiaoDichDat = new ArrayList<>();
        //new value
    @Override
    public double calculatorMoney() {
    }

    public void getDatafromKeyboard() {
        //get data from keyboard
    }

    public double avgMoney() {
    }

    public void readFile() throws FileNotFoundException, IOException, ClassNotFoundException
    {
        List<GiaoDichDat> lsttemp = new ArrayList<GiaoDichDat>();
        try
        {
            System.out.println("Doc du lieu tu file");
            ObjectInputStream obis = new ObjectInputStream(new FileInputStream( "GiaoDichDat.text"));
            lsttemp = (List<GiaoDichDat>) obis.readObject();
            obis.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        for (GiaoDichDat get : lsttemp)
        {
            System.out.println(get.toString());
        }
    }

    public void saveFile() throws FileNotFoundException, IOException
    {
        try
        {
            FileOutputStream fos = new FileOutputStream("GiaoDichDat.text");
            ObjectOutputStream obos = new ObjectOutputStream(fos);
            obos.writeObject(listGiaoDichDat);
            fos.close();
            obos.flush();
            System.out.println("Ghi du lieu thanh cong");
            obos.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
}

我从终端读取数据后,写入文件就可以了。但是当我再次阅读时。它没有数据。

要使用 ObjectInputStreamObjectOutputStream 读写对象,您的所有对象都需要实现 Serializable 但您的父对象 class 没有实现。

看来您一定是忽略了抛出的异常:

fos.close();

不要关闭它。

obos.flush();

由于之前的关闭,这应该会导致 IOException。在任何情况下你都应该删除它,因为 obos.close() 无论如何都会导致 flush()

System.out.println("Ghi du lieu thanh cong");
obos.close();

这是您唯一需要的关闭。

在这些方法中捕获 IOException 没有意义,因为它们已经被声明为抛出它,并且调用者需要知道任何异常。删除捕获块。