如何在打开文件以在Java中读取之前检查文件是否存在(相当于Perl 的
-e $filename
)?
关于 SO的唯一类似问题涉及编写文件,因此使用FileWriter
这显然不适用于此处回答。
如果可能的话,我更喜欢返回 true/false 的真正API调用,而不是一些“调用 API 来打开文件并在它引发异常时捕获,您在文本中检查‘无文件’”,但我可以忍受后者。
如何在打开文件以在Java中读取之前检查文件是否存在(相当于Perl 的
-e $filename
)?
关于 SO的唯一类似问题涉及编写文件,因此使用FileWriter
这显然不适用于此处回答。
如果可能的话,我更喜欢返回 true/false 的真正API调用,而不是一些“调用 API 来打开文件并在它引发异常时捕获,您在文本中检查‘无文件’”,但我可以忍受后者。
使用java.io.File
:
File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) {
// do something
}
我建议使用isFile()
而不是exists()
. 大多数时候,您不仅要检查路径是否指向文件,还要检查它是否存在。请记住,exists()
如果您的路径指向一个目录,它将返回 true。
new File("path/to/file.txt").isFile();
new File("C:/").exists()
将返回 true 但不允许您将其作为文件打开和读取。
通过在 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
}
如果两者都exists
返回notExists
false,则无法验证文件是否存在。(可能没有访问此路径的权限)
您可以检查path
是目录还是常规文件。
if (Files.isDirectory(path)) {
// path is directory
}
if (Files.isRegularFile(path)) {
// path is regular file
}
请查看此Java SE 7 教程。
使用 Java 8:
if(Files.exists(Paths.get(filePathString))) {
// do something
}
File f = new File(filePathString);
这不会创建物理文件。只会创建类 File 的对象。要物理创建文件,您必须显式创建它:
f.createNewFile();
所以f.exists()
可以用来检查这样的文件是否存在。
f.isFile() && f.canRead()
有多种方法可以实现这一目标。
如果只是为了存在。它可以是文件或目录。
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.exists()
在谷歌上首次点击“java文件存在”:
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 "));
}
}
不。只需捕获FileNotFoundException.
文件系统必须测试文件是否存在。这样做两次是没有意义的,并且有几个原因不这样做,例如:
不要试图猜测系统。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。
对我来说,将 Sean AO Harney 接受的答案和 Cort3z 的评论结合起来似乎是最好的解决方案。
使用了以下代码段:
File f = new File(filePathString);
if(f.exists() && f.isFile()) {
//do something ...
}
希望这可以帮助某人。
我知道我在这个线程中有点晚了。但是,这是我的答案,自 Java 7 及更高版本起有效。
以下片段
if(Files.isRegularFile(Paths.get(pathToFile))) {
// do something
}
完全令人满意,因为如果文件不存在,方法isRegularFile
将返回。false
因此,无需检查是否Files.exists(...)
.
请注意,其他参数是指示应如何处理链接的选项。默认情况下,遵循符号链接。
熟悉 Commons FileUtils 也很值得https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html 这有额外的文件管理方法和通常比JDK好。
具有良好编码实践并涵盖所有情况的简单示例:
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
不要将 File 构造函数与 String 一起使用。
这可能行不通!
而不是这个使用URI:
File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) {
// to do
}
你可以这样做
import java.nio.file.Paths;
String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
//...do somethinh
}
设计这些方法有特定的目的。我们不能说使用任何人来检查文件是否存在。