在Java中(相当于Perl的-e $filename)打开文件读取之前,如何检查文件是否存在?
SO中唯一类似的问题涉及写入文件,因此使用FileWriter来回答,这显然不适用于这里。
如果可能的话,我更喜欢一个真正的API调用返回true/false,而不是一些“调用API打开一个文件,并在它抛出一个异常时捕获你检查文本中的‘无文件’”,但我可以接受后者。
在Java中(相当于Perl的-e $filename)打开文件读取之前,如何检查文件是否存在?
SO中唯一类似的问题涉及写入文件,因此使用FileWriter来回答,这显然不适用于这里。
如果可能的话,我更喜欢一个真正的API调用返回true/false,而不是一些“调用API打开一个文件,并在它抛出一个异常时捕获你检查文本中的‘无文件’”,但我可以接受后者。
当前回答
不喜欢。只是捕捉FileNotFoundException。文件系统必须测试文件是否存在。把所有的事情都做两次是没有意义的,原因如下:
双倍代码 计时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然 事实上,这个问题的存在表明,你可能做了错误的测试,得到了错误的答案。
不要试图猜测这个系统。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。
其他回答
如果使用spring框架,文件路径以classpath开头:
public static boolean fileExists(String sFileName) {
if (sFileName.startsWith("classpath:")) {
String path = sFileName.substring("classpath:".length());
ClassLoader cl = ClassUtils.getDefaultClassLoader();
URL url = cl != null ? cl.getResource(path) : ClassLoader.getSystemResource(path);
return (url != null);
} else {
Path path = Paths.get(sFileName);
return Files.exists(path);
}
}
File f = new File(filePathString);
这将不会创建物理文件。只会创建File类的对象。要物理创建一个文件,你必须显式地创建它:
f.createNewFile();
因此f.exists()可以用来检查这样的文件是否存在。
我建议使用isFile()而不是exists()。大多数情况下,您需要检查路径是否指向一个文件,而不仅仅是它是否存在。记住,如果您的路径指向一个目录,exists()将返回true。
new File("path/to/file.txt").isFile();
new File("C:/").exists()将返回true,但不允许您将其作为文件打开并从中读取。
使用Java 8:
if(Files.exists(Paths.get(filePathString))) {
// do something
}
You must use the file class , create a file instance with the path of the file you want to check if existent . After that you must make sure that it is a file and not a directory . Afterwards you can call exist method on that file object referancing your file . Be aware that , file class in java is not representing a file . It actually represents a directory path or a file path , and the abstract path it represents does not have to exist physically on your computer . It is just a representation , that`s why , you can enter a path of a file as an argument while creating file object , and then check if that folder in that path does really exist , with the exists() method .