File.mkdirs()创建目录而不是文件

13

我正在尝试序列化以下类:

public class Library extends ArrayList<Book> implements Serializable{

public Library(){
    check();
}

使用该类的以下方法:
void save() throws IOException {
    String path = System.getProperty("user.home");
    File f = new File(path + "\\Documents\\CardCat\\library.ser");    

    ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream (f));  
    oos.writeObject(this);
    oos.close();
}

然而,程序创建的不是名为 library.ser 的文件,而是一个名为 library.ser 的空目录。为什么会这样呢?
如果有帮助的话,save() 方法最初是从同一类的此方法中调用的:
void checkFile() {
    String path = System.getProperty("user.home");
    File f = new File(path + "\\Documents\\CardCat\\library.ser");    

    try {    
         if (f.exists()){
             load(f);
         }
         else if (!f.exists()){
             f.mkdirs();
             save();
         }
    } catch (IOException | ClassNotFoundException ex) {
         Logger.getLogger(Library.class.getName()).log(Level.SEVERE, null, ex);
    }
}
2个回答

35

File.mkdirs()创建目录而不是文件

这正是它的作用。请阅读Javadoc。其中没有关于创建文件的内容。

f.mkdirs();

这行代码创建目录。应该是:
f.getParentFile().mkdirs();

1
还有 f.createNewFile(),来创建不存在的文件。 - ddmps
1
@Pescis 这完全是不必要的。new FileOutputStream() 会自动完成这个任务。 - user207421
你说得对,抛出的 FileNotFoundException 让我感到困惑。 - ddmps
在使用FileOutputStream时,如果出现目录未找到的情况,这就是为什么要使用mkdirs()的原因。 - user207421

2

我相信调用f.mkdirs()是你的问题所在。如果文件不存在(这似乎是你的情况),f.mkdirs()将会给你一个名为“library.ser”的目录,而不是一个文件,这就是为什么你的“save()”调用无法工作的原因 - 你不能将对象序列化到一个目录中。


换句话说,没有这样的限制。我真的不明白这句话与此有什么关系,或者它实际上是什么意思。 - user207421
这意味着操作系统允许他创建一个名为“library.ser”的目录。当他调用“save()”时,他最终试图将序列化保存到一个目录中,这是不可能的。 - CodeBlind
这意味着你提到的约束是虚构的。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接