重新打开GUI不会显示已保存的数据

时间:2018-05-10 18:23:42

标签: java

我是Java的新手,我需要帮助。 当我重新打开GUI时,它不会显示已保存到文件中的内容,即序列化。该文件保存成功,但当我关闭并重新打开并运行应用程序时,它不会显示在JList上,保存到此文件中的内容。

    try
    {
        FileInputStream jos = new FileInputStream("jokam.ser");
        GZIPInputStream gis = new GZIPInputStream(jos);
        ObjectInputStream hehe = new ObjectInputStream(gis);
        v1= (Vector<Vector>)hehe.readObject();


        Vpredmeti.addAll((Collection<? extends Predmet>)v1.get(0));
        Vvlak.addAll((Collection<? extends Vlak>)v1.get(1));


        jos.close();
        hehe.close(); 
        gis.close();

        v1.addAll(0, v1);

       for(Predmet pr : predmetAR){
           System.out.println(pr);

       }

    }
    catch (Exception e)
    {

}

}

这些向量是在尝试代码之前。

   Vector <Predmet> Vpredmeti = new Vector (predmetAR);
   Vector <Vlak> Vvlak= new Vector();
   Vector <Vector> v1 = new Vector<>();

这是我添加到JList的地方。

   private void DodajPredmetMouseClicked(java.awt.event.MouseEvent evt) {                                          
    // TODO add your handling code here:
   // DefaultListModel list = new DefaultListModel();
    String praznoPolje=ImePredmeta.getText();
    String drugoPraznoPolje=ZnacilnostPredmeta.getText();
    int tretjoPraznoPolje = (int)ComboBoxZabojnika.getSelectedIndex();
    Predmet novPredmet = new Predmet();
    novPredmet.ime = ImePredmeta.getText();
    novPredmet.znacilnosti = drugoPraznoPolje;
    novPredmet.tipZabojnika=tretjoPraznoPolje;
    //list.addElement(novPredmet);

    predmetAR.add(novPredmet);

保存代码

  Vector<Predmet> Vpredmet = new Vector<>(predmetAR);
  Vector<Vlak> Vvlak = new Vector<>(vlakAR);
  Vector<Vector> v = new Vector<>();
  v.add(0,Vpredmet);
  v.add(1,Vvlak);



    try
   {
       FileOutputStream fos = new FileOutputStream("jokam.ser");
       GZIPOutputStream gos = new GZIPOutputStream(fos);
       ObjectOutputStream oos = new ObjectOutputStream(gos);
       oos.writeObject(v);
       gos.close();
       fos.close();
       oos.close();


   }        
   catch(Exception e)
   {

   }
}                                                                  

1 个答案:

答案 0 :(得分:0)

您注意到的那些例外几乎肯定是早期关闭流的问题,无论是在写入部分还是在读取部分。它也表明了流的分层问题,但我在这里看不到。

解决这些问题的第一步是确保在流关闭之前以正确的顺序写入所有数据。在关闭它或底层部分之前,我通常flush()最高级别的流。 flush()最高级OutputStream(此处为ObjectOutputStream),它会刷新所有基础流(此处为GZIPOutputStreamFileOutputStream)。从技术上讲,close()也是flush(),因此可能没有必要。

此外,请确保close()流的顺序正确。与flush()相同,关闭更高级别的流,基础流自动获得close() d(和flush() ed。

您已拥有的代码close()首先是GZIPOutputStream,这排除了ObjectOutputStream的结束位。稍后,ObjectOutputStreamclose() d将尝试写入这些位,但基础流已经关闭,因此会抛出IOException

写作时,我建议尝试:

objectOutputStream.close();

至于阅读,这应该是好的:

objectInputStream.close()

正如我在评论中提到的那样,您应该在close()块中finally,以便Exception块中抛出的任何try仍会导致close()被叫。请注意,close()也可以抛出Exception;)

为了自行调查,我建议查看所有这些流的源代码,看看里面发生了什么。 JDK包含一个可选的jdk/lib/src.zip,大多数IDE都可以让你跳转到它。试着去定义&#39;在objectOutputStream.close()上,您应该看到源代码。