我有一个写入日志文件的方法。如果文件存在,它应该附加到它,如果没有,那么我希望它创建一个新文件。
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。
我有什么遗漏才能让它发挥作用吗?
答案 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" />