保存到Java中的对象文件:getParentFile()

保存到Java中的对象文件:getParentFile(),java,outputstream,mkdir,object-files,Java,Outputstream,Mkdir,Object Files,我有以下代码将Vehicleule类型的对象保存到文件中。但是,我不太了解它是如何工作的,因为它是为我提供的一个示例,而且我是java领域的新手 我想知道如果(!f.getParentFile().exists()),这些行的解释是什么{ f、 getParentFile().mkdirs(); }我想知道getParentFile().exists()做了什么,为什么我们对父文件本身感兴趣,却在搜索父文件。下一行同样的问题:当我们要创建文件时,为什么我们对父目录感兴趣? 我还想知道FileOu

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

我想知道如果(!f.getParentFile().exists()),这些行的解释是什么{ f、 getParentFile().mkdirs(); }我想知道
getParentFile().exists()
做了什么,为什么我们对父文件本身感兴趣,却在搜索父文件。下一行同样的问题:当我们要创建文件时,为什么我们对父目录感兴趣? 我还想知道
FileOutputStream
ObjectOutputStream
之间的区别,以及为什么在下面几行中一个接一个地使用这两者
FileOutputStream fout=newfileoutputstream(f,false)//覆盖,附加设置为false
ObjectOutputStream out=新的ObjectOutputStream(fout)

提前感谢

文件是指向文件系统上文件或目录位置的指针。但是,如果要写入文件,则它将驻留的父目录必须存在。否则,您将得到一个
IOException
。调用
mkdirs
将创建必要的父目录,以避免出现
IOException

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

另外,您应该在
finally
块中关闭OutputStream,或者使用Java 7 try with resources:

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();
        }

您应该保持
存在
,但也要检查
mkdirs
的返回值,以处理您没有创建父目录的权限的情况。关于始终关闭
中的所有内容/释放
中的资源,这是一个非常好的建议。如果您使用的是JDK 7+,那么您也可以使用“try with resources”构造,它做同样的事情,但是更干净,并且提供了获取“吞没”异常的能力。使用“尝试使用资源”方法更新了答案。
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f, false))) {
    out.writeObject(vehicles);
}