提问人:DVK 提问时间:11/30/2009 最后编辑:Arsen KhachaturyanDVK 更新时间:12/11/2022 访问量:1435470
如何检查 Java 中是否存在文件?
How do I check if a file exists in Java?
问:
在打开文件进行 Java 读取之前,如何检查文件是否存在(相当于 Perl 的)?
-e $filename
SO 上唯一类似的问题涉及编写文件,因此使用该问题回答,这显然不适用于此处。FileWriter
如果可能的话,我更喜欢一个真正的 API 调用返回 true/false,而不是一些“调用 API 打开文件并在它抛出异常时捕获,您检查文本中的”无文件“,但我可以忍受后者。
答:
使用 java.io.File
:
File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) {
// do something
}
评论
if(f.isFile())
f.isFile()
false
f
f.exists() && !f.isDirectory()
您可以使用以下命令:File.exists()
在 Google 上首次点击“Java File Exists”:
import java.io.*;
public class FileTest {
public static void main(String args[]) {
File f = new File(args[0]);
System.out.println(f + (f.exists()? " is found " : " is missing "));
}
}
评论
String.valueOf()
熟悉 Commons FileUtils 也非常值得 https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html 这有其他管理文件的方法,而且通常比 JDK 更好。
评论
我建议使用 代替 .大多数情况下,您希望检查路径是否指向文件,而不仅仅是它存在。请记住,如果您的路径指向目录,则返回 true。isFile()
exists()
exists()
new File("path/to/file.txt").isFile();
new File("C:/").exists()
将返回 true,但不允许你将其作为文件打开和读取。
评论
/path
new File("file.txt").exists()
true
/path/to/file.txt
/path/file.txt
f.isFile() && f.canRead()
评论
-e
File f = new File(filePathString);
这不会创建物理文件。将只创建类 File 的对象。若要以物理方式创建文件,必须显式创建它:
f.createNewFile();
所以可以用来检查这样的文件是否存在。f.exists()
不要。只需抓住文件系统必须测试文件是否存在。做两次是没有意义的,有几个理由不这样做,例如:FileNotFoundException.
- 双倍代码
- 计时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然,以及
- 事实上,正如这个问题的存在所表明的那样,您可能会进行错误的测试并得到错误的答案。
不要试图对系统进行事后猜测。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最好方法是尝试使用它。
评论
通过在 Java SE 7 中使用 nio,
import java.nio.file.*;
Path path = Paths.get(filePathString);
if (Files.exists(path)) {
// file exist
}
if (Files.notExists(path)) {
// file is not exist
}
如果两者都返回 false,则无法验证文件是否存在。(也许没有访问此路径的权限)exists
notExists
您可以检查是目录文件还是常规文件。path
if (Files.isDirectory(path)) {
// path is directory
}
if (Files.isRegularFile(path)) {
// path is regular file
}
请查看此 Java SE 7 教程。
评论
java.nio.file.Files.exists()
java.io.File.exists()
java.nio.file.Files.exists()
java.io.File.exists
对我来说,Sean A.O. Harney 接受的答案和 Cort3z 由此产生的评论的结合似乎是最好的解决方案。
使用了以下代码片段:
File f = new File(filePathString);
if(f.exists() && f.isFile()) {
//do something ...
}
希望这可以帮助某人。
使用 Java 8:
if(Files.exists(Paths.get(filePathString))) {
// do something
}
评论
Files.exists()
需要两个参数。通常,您需要类似 .Files.exists(path, LinkOption.NOFOLLOW_LINKS )
有多种方法可以实现这一点。
如果只是为了存在。它可以是文件或目录。
new File("/path/to/file").exists();
检查文件
File f = new File("/path/to/file"); if(f.exists() && f.isFile()) {}
检查目录。
File f = new File("/path/to/file"); if(f.exists() && f.isDirectory()) {}
Java 7 方式。
Path path = Paths.get("/path/to/file"); Files.exists(path) // Existence Files.isDirectory(path) // is Directory Files.isRegularFile(path) // Regular file Files.isSymbolicLink(path) // Symbolic Link
不要将 File 构造函数与 String 一起使用。
这可能行不通!
而不是这样,请使用 URI:
File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) {
// to do
}
评论
我知道我在这个线程中有点晚了。但是,这是我的答案,自 Java 7 及更高版本以来有效。
以下代码片段
if(Files.isRegularFile(Paths.get(pathToFile))) {
// do something
}
是完全满意的,因为如果文件不存在,方法会返回。因此,无需检查 .isRegularFile
false
Files.exists(...)
请注意,其他参数是指示应如何处理链接的选项。默认情况下,符号链接是遵循的。
评论
Files.notExists
Files.isDirectory
Files.isRegularFile.
path.toFile().exists()
你可以这样做
import java.nio.file.Paths;
String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
//...do somethinh
}
评论
File.is Exist()
Files.isRegularFile()
具有良好编码实践并涵盖所有情况的简单示例:
private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
if (f.exists()) {
throw new FileAlreadyExistsException(f.getAbsolutePath());
} else {
try {
URL u = new URL(url);
FileUtils.copyURLToFile(u, f);
} catch (MalformedURLException ex) {
Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
参考资料和更多示例,请访问
https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations
评论
设计这些方法有特定的目的。我们不能说使用任何人来检查文件是否存在。
- isFile():测试这个抽象路径名所表示的文件是否是普通文件。
- exists():测试由此抽象路径名表示的文件或目录是否存在。docs.oracle.com
您必须使用 file 类 ,创建一个文件实例,其中包含要检查的文件路径是否存在。之后,您必须确保它是一个文件而不是 目录 .之后,您可以在引用文件的文件对象上调用 exist 方法。请注意,java中的文件类并不代表文件。它实际上代表一个目录路径或一个文件路径,它所代表的抽象路径不必物理存在于你的计算机上。它只是一个表示,这就是为什么,你可以在创建文件对象时输入一个文件的路径作为参数,然后用exists()方法检查该路径中的那个文件夹是否真的存在。
评论
如果使用 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);
}
}
评论
canRead
canWrite
canExecute