【问题标题】:Saving to an object file in Java: getParentFile()在 Java 中保存到目标文件:getParentFile()
【发布时间】:2013-04-27 12:29:09
【问题描述】:
public void save() throws IOException {
            File f = new File(path);
            if (!f.getParentFile().exists()) {
                f.getParentFile().mkdirs();
            }
            FileOutputStream fout = new FileOutputStream(f, false);//overwrite, append set to false
            ObjectOutputStream out = new ObjectOutputStream(fout);

            out.writeObject(this.vehicles);
            out.close();
        }

我有以下代码将车辆类型的对象保存到文件中。但是,我不太了解它是如何工作的,因为它是为我提供的示例,而且我是 java 领域的新手。

我想知道if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } 这些行的解释是什么我想知道getParentFile().exists() 做了什么以及为什么我们在对文件本身感兴趣的同时搜索父文件。下一行的同样问题:为什么我们要创建文件时对父目录感兴趣? 我还想知道FileOutputStream 和ObjectOutputStream 之间的区别以及为什么在以下几行FileOutputStream fout = new FileOutputStream(f, false);//overwrite, append set to false ObjectOutputStream out = new ObjectOutputStream(fout); 中两者并排使用 提前谢谢你

【问题讨论】:

    标签: java outputstream mkdir object-files


    【解决方案1】:

    文件是指向文件系统上文件或目录位置的指针。但是,如果您打算写入文件,则它所在的父目录必须存在。否则,您将收到IOException。 mkdirs 调用将创建必要的父目录(或多个目录)以避免IOException。

    不过,我认为 exists 检查并不是真正必要的,因为如果 mkdirs 方法实际上没有创建任何内容,则它会返回 false。

    此外,您应该在 finally 块内关闭您的 OutputStream 或使用 Java 7 try-with-resources:

    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f, false))) {
        out.writeObject(vehicles);
    }
    

    【讨论】:

    • 您应该保留exists,但还要检查mkdirs的返回值,以处理您没有创建父目录的权限的情况。
    • 关于始终关闭 finally 中的所有内容/释放资源的非常好的建议。如果您使用的是 JDK 7+,您还可以使用“try with resources”构造,它做同样的事情但更简洁,并提供了处理“吞下”异常的能力。
    • 好点,阿尔文。使用 try-with-resources 方法更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多