如何检查Java中是否存在文件?
在打开文件以在Java中读取(相当于Perl的如何检查Java中是否存在文件?,java,file-io,io,file-exists,Java,File Io,Io,File Exists,在打开文件以在Java中读取(相当于Perl的-e$filename)之前,如何检查文件是否存在 问题只涉及写入文件,因此使用FileWriter来回答,这在这里显然不适用 如果可能的话,我更喜欢返回true/false的真实API调用,而不是“调用API打开一个文件并捕获它抛出的异常,您可以检查文本中的“无文件”,但我可以接受后者。使用: 您可以使用以下内容:File.exists()在google上首次点击“java文件存在”: import java.io.*; public class
-e$filename
)之前,如何检查文件是否存在
问题只涉及写入文件,因此使用FileWriter
来回答,这在这里显然不适用
如果可能的话,我更喜欢返回true/false的真实API调用,而不是“调用API打开一个文件并捕获它抛出的异常,您可以检查文本中的“无文件”,但我可以接受后者。使用:
您可以使用以下内容:
File.exists()
在google上首次点击“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 "));
}
}
熟悉Commons FileUtils也很有价值
这有额外的文件管理方法,通常比JDK更好。我建议使用
isFile()
而不是exists()
。大多数情况下,您需要检查路径是否指向文件,而不仅仅是它是否存在。请记住,如果路径指向目录,则exists()
将返回true
new File("path/to/file.txt").isFile();
new File(“C:/”).exists()
将返回true,但不允许您将其作为文件打开和读取
f.isFile() && f.canRead()
这不会创建物理文件。将只创建类文件的对象。要实际创建文件,必须显式创建:
f.createNewFile();
所以
f.exists()
可以用来检查这样的文件是否存在。不要。只需捕获FileNotFoundException。
文件系统必须测试文件是否仍然存在。两次这样做没有意义,有几个理由不这样做,例如:
- 双重密码
- 定时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然,以及
- 事实上,正如这个问题的存在所表明的那样,你可能会进行错误的测试并得到错误的答案
不要试图猜测系统。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。通过在JavaSE7中使用nio
import java.nio.file.*;
Path path = Paths.get(filePathString);
if (Files.exists(path)) {
// file exist
}
if (Files.notExists(path)) {
// file is not exist
}
如果存在
和notExists
都返回false,则无法验证文件是否存在。(可能没有访问此路径的权限)
您可以检查path
是目录还是常规文件
if (Files.isDirectory(path)) {
// path is directory
}
if (Files.isRegularFile(path)) {
// path is regular file
}
请检查此项。对于我来说,肖恩·阿奥·哈尼(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
}
实现这一点有多种方法
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()) {}
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
不要将文件构造函数与字符串一起使用。
这可能行不通
不使用此URI:
File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) {
// to do
}
我知道我在这方面有点晚了。然而,这里是我的答案,自Java7和更高版本以来一直有效 下面的代码片段
if(Files.isRegularFile(Paths.get(pathToFile))) {
// do something
}
非常令人满意,因为如果文件不存在,方法isRegularFile
将返回false
。因此,无需检查文件是否存在(…)
请注意,其他参数是指示应如何处理链接的选项。默认情况下,后面跟着符号链接
你可以这样做
import java.nio.file.Paths;
String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
//...do somethinh
}
具有良好编码实践并涵盖所有情况的简单示例:
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);
}
}
}
参考和更多示例,请访问
设计这些方法有特定的目的。我们不能说使用任何人来检查文件是否存在
无需检查f!=检查f之前为null。如果新关键字失败,它将生成异常。如果f!=无效的f+(…)使用java.io.File。toString@just实际上,它使用
String.valueOf()
,该函数处理空值漂移以避免回答问题。我同意commons有很多有用的东西,但也许我们可以更进一步,为OP提出的问题提供答案。他给了我足够的答案。pearl的-e
是否也能确保应用程序“可以阅读”文件?如果我想每小时检查一次文件是否已存放在某个位置,该怎么办。我有一个webMethods项目,必须检查特定文件是否已上载到特定驱动器。如何做到这一点。比方说,我想每小时检查一次,看看文件是否在那里。我可以用Java编写一个类来完成这项工作,可能需要使用某种计时器。捕获异常的代价要高得多。在我的测试中,检查新文件().exists()比捕获FileNotFoundException快10倍多。所以,若您有一个通常预期会丢失文件(如磁盘缓存)的场景,那个么异常是错误的。另外,事后再猜猜这个系统很酷。@Gnawer你还没有解决我提出的任何问题;只有当文件无法打开时才会引发异常;而且每小时发生一次的操作不需要微观优化。你的最后一句话是胡说八道。@DougHauf在你的例子中没有问题,因为在你检查存在之后你没有尝试做任何事情。但OP特别要求在开业前进行检查。在这种情况下,最好只是尝试/捕获打开的文件。还要添加您希望检查适当文件权限的内容:java.io.file有方法canRead
,canWrite
,和canExecute
来检查。应该注意,这是危险的。文件系统可以随时更改,包括在“dothisfileexist”方法返回后立即更改。既然你要处理
import java.nio.file.Paths;
String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
//...do somethinh
}
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);
}
}
}