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

时间:2009-10-06 11:36:05

标签: java file-io

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

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

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

我有什么遗漏才能让它发挥作用吗?

9 个答案:

答案 0 :(得分:96)

尝试确保父目录存在:

file.getParentFile().mkdirs()

答案 1 :(得分:10)

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:3)

根据[java docs](http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()createNewFile将为您原子创建一个新文件。

Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.

鉴于createNewFile是原子的并且不会覆盖现有文件,您可以将代码重写为

try {
    if(!file.createNewFile()) {
        System.out.println("File already exists");
    } 
} catch (IOException ex) {
    System.out.println(ex);
}

这可能会使任何潜在的线程问题,竞争条件等更容易被发现。

答案 4 :(得分:3)

我认为您获得的异常可能是原子方法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
}

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

答案 5 :(得分:2)

你肯定得到了这个例外 '系统无法找到指定的路径'

只需打印'file.getAbsoluteFile()',即可让您知道要创建的文件是什么。

如果您创建文件的目录不存在,则会发生此异常

答案 6 :(得分:1)

//Create New File if not present
if (!file.exists()) {
    file.getParentFile().mkdirs();

    file.createNewFile();
    Log.e(TAG, "File Created");
}

答案 7 :(得分:0)

这可能是线程问题(一起检查和创建不是原子的:!file.exists() && !file.createNewFile())或“文件”已经是目录

尝试(file.isFile()):

if (file.exists() && !file.isFile()){
   //handle directory is there
}else if(!file.createNewFile()) {
   //as before
}

答案 8 :(得分:0)

在我的情况下,只是缺乏许可:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />