【问题标题】:Java FileStream - ObjectOutputStream ObjectInputStreamJava FileStream - ObjectOutputStream ObjectInputStream
【发布时间】:2015-01-05 23:07:19
【问题描述】:

我正在使用 Java 和 Swing 为“电影管理器”创建一个小 GUI。

我有一个类 MovieTableModel,它扩展了 AbstractTableModel,并在 Object[][]data 中包含表行的数据。 第二类 MovieUI 管理 JFrame 以及一般的 GUI。 最后一个类 MovieManager 实际上只是一个创建 movieui 实例并使其可见的主函数。

现在我的问题是,到目前为止,数据已“保存”在我的代码中。我希望它能够被加载和保存。如果没有保存文件,应该创建一个,我应该能够添加或删除它的行(动作监听器已经设置,我只需要一种处理文件的方法)。

所以 GUI 看起来像这样: MovieManager

这有点像我尝试过的:

        File tabledata = new File("tabledata.class");
    if (!tabledata.exists()) {
        try {
            tabledata.createNewFile();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    tabledata.



    FileInputStream in = new FileInputStream("tabledata.class");
    ObjectInputStream input = new ObjectInputStream(in);
    Object data = input.readObject();
    System.out.print(data);

两者都不起作用 - 我想我确实了解它的一般工作原理,但我不知道如何将它用于我表中的数据,特别是因为它被保存为 Object[][] 但是该文件是一个对象。 如果可行 - 我如何添加或删除单行?

提前感谢您的帮助! :)

【问题讨论】:

    标签: java swing tablerow objectinputstream objectoutputstream


    【解决方案1】:

    如果您序列化您的 tablemodel 或支持您的 tablemodel 的对象,那么您可以稍后读取它并将其恢复到 JTable。

    当您再次从 ObjectInputStream 读取对象时,我认为您缺少转换为您正在保存的正确类型的转换:

    FileInputStream in = new FileInputStream("tabledata.class");
    ObjectInputStream input = new ObjectInputStream(in);
    Object[][] data = (Object[][])input.readObject();
    

    【讨论】:

      【解决方案2】:

      创建新文件后,您需要使用ObjectOutputStream 写入数据,然后使用ObjectInputStream 读取数据。

      Object[][] data;
      //save
      File tabledata = new File("tabledata.dat"); //I wouldn't use class extension (class is for compiled Java)
      //creation of file omitted
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(tabledata));
      out.writeObject(data);
      out.close();
      
      //load
      ObjectInputStream  in = new ObjectInputStream(new FileInputStream(tabledata));
      data = (Object[][]) in.readObject(); //explict cast required
      in.close();
      

      因为这会将所有数据存储为一大块,所以我认为不可能只读取/写入一个元素。您将不得不求助于计算存储对象的字节数,然后跳到正确的位置。如果你真的需要存储大量的表数据,我会使用一些关系数据库作为后端。否则我不会为这样的优化而烦恼。只需在保存时重写所有内容。

      【讨论】:

        猜你喜欢
        • 2012-05-29
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        相关资源
        最近更新 更多