使用Serializable读取/写入对象

时间:2018-04-17 22:20:37

标签: java javafx

所以我有一个实现Serializable的对象,一个酒店。我正在使用具有许多按钮的FX应用程序。 FX应用程序有一个酒店对象,作为一个字段,它是我想要读/写的对象。

  1. 写入之前是否已读取?还是在读之前写的?它应该在start方法中吗?

  2. 启动时,您是否拥有彼此相邻的读/写方法?或者我应该有一个按钮来关闭/保存应用程序,并让它将对象写入文件(并在启动时读取)?

  3. 这是我到目前为止所做的,而且我相信它的写作成功,但它不是在阅读。

     @Override
    public void start(Stage primaryStage) {
    
           try {
            ObjectOutputStream oosoos = new ObjectOutputStream(new FileOutputStream("hotelRooms.dat"));
            oosoos.writeObject(hotel);
            }catch (IOException e) {
                System.out.println(e.getMessage());
             }   
          //  Hotel tempHotel;
             try {
        ObjectInputStream iisiis = new ObjectInputStream(new FileInputStream("hotelRooms.dat"));
        hotel = (Hotel)iisiis.readObject();
    
        } catch (IOException | ClassNotFoundException ffe ) {
            System.out.println(ffe.getMessage());
        } 
    

2 个答案:

答案 0 :(得分:0)

我之前从未使用过FX,但我认为通过做出一些假设,我可以提供帮助......

我假设你的start()方法是一些FX类定义的生命周期方法,你需要在应用程序启动时加载Hotel对象。大概你有一些finish()方法,你想在以后保存最新版本的酒店对象..?

如果是这样,你需要在start()方法中'read()'对象,并在finish()方法中'write()'酒店。

您的代码段中的问题是您尝试在start()方法中执行这两个操作。这有各种各样的潜在问题,尤其是你的write()方法需要刷新流(导致数据实际写入文件),然后你可能需要在输入流之前关闭输出流将被允许​​阅读。

可能。

如果你打电话

,可能就是这样
oosoos.close();   // this will flush the stream

...后

oosoos.writeObject(hotel);

然后intput流将成功读取该对象。 但是,你真的需要像我之前提到的那样拆分这段代码 - 你发布的代码毫无意义;你把Hotel对象写到文件然后再读回来......你可以使用你写入文件的对象,而不用再读回来......

如果由于缺乏对FX的了解而误解我,这有助于道歉。

答案 1 :(得分:0)

我做的是拆分读/写。我有它,所以它在启动时读取/输入,当他们单击按钮创建预订时,它会将当前酒店对象写入文件。