我使用commons-io FileUtils.openOutputStream(File)方法获得了一些新代码,用于调用时不存在的文件。这是因为“FileNotFoundException”失败了。我首先认为这是commons-io中的一个错误,但后来我意识到它只是调用“new FileOutputStream(file,append)”,如果它不存在,它也应该创建该文件。
然后我在调用FileUtils.openOutputStream(File)之前添加了代码,如下所示:
if (!file.exists()) {
logger.info("Parent file exists: " + file.getParentFile().exists());
try {
file.createNewFile();
}
catch (Exception ex) {
logger.error("Creating file failed", ex);
}
}
这将为父文件打印“true”,然后“java.io.IOException:系统找不到指定的路径”。我搜索了这种情况,如果他们超过了Windows上文件路径的假定260个字符限制,有些人正在点击这个。我认为这可能是相关的,但我的文件路径只有230个字符。
我还尝试过尝试在我的Cygwin bash shell中“触摸”相同的文件路径的实验,并且它没有遇到任何麻烦。
更新:
所以我采取了部分建议尝试使用Paths&要执行此操作的文件而不仅仅是“文件”。我的传入参数是“文件”,所以我对此无能为力。我添加了以下代码:
try {
Path path = Paths.get(file.getAbsolutePath()).toAbsolutePath();
if (!Files.exists(path.getParent())) {
Files.createDirectories(path);
}
file = Files.createFile(path).toFile();
}
catch (Exception ex) {
logger.error("Failed to create file");
}
奇怪的是,这并没有给我一个更好的错误信息。实际上,它不会给我任何错误消息,因为它不会失败。看起来NIO采用了与常规File对象不同的创建文件的路径。
更新:
现在正常工作如下:
file = Paths.get(file.getAbsolutePath()).toAbsolutePath().toFile();
try {
Path path = file.toPath();
if (!Files.exists(path.getParent())) {
Files.createDirectories(path);
}
if (!file.exists()) {
file = Files.createFile(path).toFile();
}
}
catch (Exception ex) {
logger.error("Failed to create file");
}
奇怪的是,我应该能够删除第一行,这实际上是将相对路径转换为绝对路径。我的测试运行会在此过程中创建50个左右的文件。我尝试评论该行,然后清除输出树并运行测试。尝试创建第一个文件时出现以下异常:
java.nio.file.AccessDeniedException: build\gen1\org\opendaylight\yang\gen\v1\urn\opendaylight\params\xml\ns\yang\pcep\types\rev131005\vs\tlv\vs\tlv\VendorPayload.java
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
到底是什么?
另请注意,我从未删除使用“File.createNewFile()”的旧代码,我只是在此之前放置“Files”代码,旧代码检查“!file.exists()”,所以理论上,旧代码只有在新代码以某种方式不创建文件时才会执行。在第一个文件中,由于NIO创建失败,文件仍然不存在,并且它经历了旧的创建代码,即成功。
甚至更奇怪,我让测试用例运行到下一个文件,并且在新代码中失败了:
java.nio.file.FileAlreadyExistsException: build\gen1\org\opendaylight\yang\gen\v1\urn\opendaylight\params\xml\ns\yang\pcep\types\rev131005\vs\tlv\VsTlv.java
请注意,块可能获得该异常的唯一方法是它执行“Files.createFile(path).toFile()”行,并且唯一可能获得该行的方法是“!file” .exists()“为TRUE,表示该文件不存在。我的大脑开始融化。还要注意,当我坐在这个断点处时,我检查了文件系统,并且该文件不存在。
答案 0 :(得分:2)
这是2015年,你说你使用Java 7。
Don't use File
。请改用:
final Path path = Paths.get("....").toAbsolutePath();
// use Files.exists(path.getParent()) to check for the existence;
// if it doesn't exist use Files.createDirectories() on it
Files.createFile(thePath);
如果操作失败,您至少会得到有意义的异常,告诉您失败的原因。
这是2015年。下降。 File
。现在