如何在打开文件以在 Java 中读取之前检查文件是否存在(相当于 Perl 的 -e $filename)?
唯一的 similar question on SO 处理写入文件,因此使用 FileWriter
回答,这显然不适用于此处。
如果可能的话,我更喜欢返回 true/false 的真正 API 调用,而不是一些“调用 API 打开文件并在它引发异常时捕获,您检查文本中的‘无文件’”,但我可以忍受后者。
canRead
、canWrite
和 canExecute
来检查。
使用 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,但不允许您将其作为文件打开和读取。
/path
,如果正确的完整路径是 /path/to/file.txt
,new File("file.txt").exists()
是否会返回 true
,答案是否定的(除非存在另一个文件 /path/file.txt
)。
通过在 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 tutorial。
java.nio.file.Files.exists()
比 java.io.File.exists()
快很多(来自我在我测试的唯一计算机上的小基准测试:运行 Java 1.7.0_45 x64 的 Windows Server 2012)。
java.nio.file.Files.exists()
比 java.io.File.exists
SLOWER 5 倍。 (Win7 Java 1.7.0_79 - x86)
使用 Java 8:
if(Files.exists(Paths.get(filePathString))) {
// do something
}
Files.exists()
有两个参数。通常,您需要类似 Files.exists(path, LinkOption.NOFOLLOW_LINKS )
的内容。
File f = new File(filePathString);
这不会创建物理文件。只会创建类 File 的对象。要物理创建文件,您必须显式创建它:
f.createNewFile();
所以 f.exists()
可以用来检查这样的文件是否存在。
f.isFile() && f.canRead()
-e
是否也确保应用程序“可以读取”文件?
有多种方法可以实现这一目标。
如果只是为了存在。它可以是文件或目录。 new File("/path/to/file").exists();检查文件 File f = new File("/path/to/file"); if(f.exists() && f.isFile()) {} 检查目录。文件 f = new File("/path/to/file"); if(f.exists() && f.isDirectory()) {} Java 7 方式。路径 path = Paths.get("/path/to/file"); Files.exists(path) // 存在 Files.isDirectory(path) // 是目录 Files.isRegularFile(path) // 常规文件 Files.isSymbolicLink(path) // 符号链接
不。只需捕捉 FileNotFoundException.
文件系统必须测试文件是否存在。这样做两次是没有意义的,并且有几个原因不这样做,例如:
加倍代码
时间窗口问题,即文件可能在您测试时存在但在您打开时不存在,反之亦然,以及
事实上,正如这个问题的存在所表明的那样,您可能会进行错误的测试并得到错误的答案。
不要试图猜测系统。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。
您可以使用以下内容: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 "));
}
}
String.valueOf()
,它处理空值
对我来说,将 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(...)
。
请注意,其他参数是指示应如何处理链接的选项。默认情况下,遵循符号链接。
From Java Oracle documentation
Files.notExists
也是如此, Files.isDirectory
和 Files.isRegularFile.
最好的替代方法是:path.toFile().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
}
File.is Exist()
或Files.isRegularFile()
相比具有最佳性能
设计这些方法有特定的目的。我们不能说使用任何人来检查文件是否存在。
isFile():测试这个抽象路径名表示的文件是否为普通文件。 exists():测试这个抽象路径名表示的文件或目录是否存在。 docs.oracle.com
您必须使用文件类,使用您要检查的文件的路径创建一个文件实例是否存在。之后,您必须确保它是文件而不是目录。之后,您可以在引用您的文件的文件对象上调用存在方法。请注意,java 中的文件类不代表文件。它实际上代表一个目录路径或一个文件路径,它代表的抽象路径不必物理地存在于您的计算机上。这只是一种表示,这就是为什么您可以在创建文件对象时输入文件路径作为参数,然后使用 exists() 方法检查该路径中的文件夹是否确实存在。
不定期副业成功案例分享
if(f.isFile())
。f
是一个目录或者它不存在,则f.isFile()
返回false
。因此,它(大部分)等价于f.exists() && !f.isDirectory()
,尽管后者更明确地表达了意图。