【问题标题】:Serialize object to a file将对象序列化为文件
【发布时间】:2013-12-09 16:00:54
【问题描述】:

我有一些存储数据的基本类:

class Item implements java.io.Serializable {
    String this.data = "";
    public void saveData(String data) {
        this.data = data;
    }
    public String getData() {
        return this.data;
    }
}

还有另一个类中的一个函数,它应该将 Item 实例保存到文件中:

    private static void saveItemToFile(File folder, Item item) throws IOException{
    FileOutputStream fos = new FileOutputStream(
            folder.getAbsolutePath() + item.getData() + ".obj");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(item);
    oos.close();
}

测试代码:

Item itm = new Item();
itm.saveData("String data here");
File folder = new File(System.getProperty("user.home") + "/.CDDB");
saveItemToFile(folder, itm);

但是这段代码不起作用。没有引发任何错误或异常,但它只是不在指定文件夹中创建文件。我的错误是什么?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 字符串 this.data = ""; ??
  • 请在最后一部分显示您的整个代码;你必须在某个地方处理IOException,但我没有看到它,我怀疑你正在吞下一个正在抛出的异常(可能folder 不存在)。此外,在调用saveItemToFile 之前调试和检查folder 的值,并检查传递给new FileOutputStream 的值。

标签: java file serialization


【解决方案1】:

您的目标路径是通过将文件名添加到不带路径分隔符的目录路径来构建的:

folder.getAbsolutePath() + item.getName() + ".obj"

所以你应该有一个名为[USER_HOME]/.CDDB[item name].obj的文件

最好直接使用File 对象:

private static void saveItemToFile(File folder, Item item) throws IOException {
    File file = new File(folder, item.getName() + ".obj");
    try (ObjectOutputStream oos =
            new ObjectOutputStream(new FileOutputStream(file))) {
        oos.writeObject(item);
    }
}

【讨论】:

    【解决方案2】:

    我已经编译并运行了你的程序,这是我观察到的:

    创建了一个名为.CDDBString data here.obj的文件

    我认为您打算创建一个名为 String data here.obj 的文件,但在 saveItemToFile 中,您将文件夹和文件名连接在一起以获得文件名,而没有路径分隔符。

    这应该可以解决问题:

    private static void saveItemToFile(File folder, Item item) throws IOException{
      File out = new File(folder, item.getData() + ".obj");
      FileOutputStream fos = new FileOutputStream(out);
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(item);
      oos.close();
    }
    

    【讨论】:

      【解决方案3】:

      此代码工作正常,可能是您为生成的文件寻找错误的文件夹。唯一的问题是它附加了.CDDB 以及文件名。如果您无法找到 user.home 文件夹,请添加以下行以打印对象序列化对象的位置。

      System.out.println("--- output path "+System.getProperty("user.home"));
      

      否则创建带有参数System.getProperty("user.home") + "/.CDDB"File 对象并传递给OutputStream

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-23
        • 2011-04-09
        • 2021-02-13
        • 1970-01-01
        • 2012-01-08
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多