File.createNewFile()thowing IOException没有这样的文件或目录

A J*_*son 32 java file-io

我有一个写入日志文件的方法.如果文件存在,它应该附加到它,如果没有,那么我希望它创建一个新文件.

if (!file.exists() && !file.createNewFile()) {
    System.err.println("Error with output file: " + outFile
        + "\nCannot create new file.");
    continue;
}
Run Code Online (Sandbox Code Playgroud)

我有这个来检查是否可以创建一个文件.file是一个java.io.File对象.createNewFile抛出IOException:没有这样的文件或目录.自从我几周前写这篇文章以来,这种方法一直运作良好,并且最近刚开始这样做,虽然我不知道我能改变什么.我已经检查过,目录存在并且我有权限,但是我认为如果它因任何原因无法生成文件,它应该返回false.

有什么我不想让这个工作吗?

Omr*_*dan 106

尝试确保父目录存在:

file.getParentFile().mkdirs()
Run Code Online (Sandbox Code Playgroud)


Mis*_*ble 15

也许创建文件的目录不存在?


Nic*_*dan 7

通常这是你最近改变的东西,首先关闭你的示例代码,如果不存在文件而不创建新文件 - 你试图编写代码 - 它是什么?

然后,查看目录列表以查看它是否确实存在,并在文件对象上执行println/toString(),并在异常上执行getMessage(),以及打印堆栈跟踪.

然后,再次从零知识开始,并从您使用的每个步骤重新考虑到这里.这可能是你在某个地方陷入困境而在代码中进行概念化(因为它正在工作) - 你只是详细地追溯每一步,你会发现它.


小智 6

我认为你得到的异常很可能是原子方法的文件检查的结果file.createNewFile()。该方法无法检查文件是否存在,因为某些父目录不存在或您无权访问它们。我建议这样做:

if (file.getParentFile() != null && !file.getParentFile().mkDirs()) {
    // handle permission problems here
}
// either no parent directories there or we have created missing directories
if (file.createNewFile() || file.isFile()) {
    // ready to write your content
} else {
    // handle directory here
}
Run Code Online (Sandbox Code Playgroud)

如果考虑并发性,所有这些检查都是无用的,因为在每种情况下,其他线程都可以创建、删除或对您的文件执行任何其他操作。在这种情况下,您必须使用我不建议这样做的文件锁;)