如何打开文件以在Java中读取之前,是否检查文件是否存在?(相当于Perl的-e $filename)。
关于so的唯一类似问题是写文件,因此用filewriter回答,显然在这里不适用。
如果可能的话,我更喜欢一个返回true/false的真正的API调用,而不是一些"调用API打开一个文件,并在它抛出异常时捕获,您检查文本中是否有"no file",但我可以接受后者。
- 还要添加一点,您需要检查适当的文件权限:docs.oracle.com/javase/6/docs/api/java/io/file.html java.io.file有方法canRead、canWrite和canExecute来检查这一点。
- 应该注意这是危险的。文件系统可以随时更改,包括在返回"does this file exist"方法之后。因为无论如何,您都必须处理这个案例,所以这种方法的实用性是有问题的。如果要打开文件,正确的方法是打开文件并处理相关的异常。
- @Kevin说得对,但它在非并发环境中的实用性是毋庸置疑的,这恰好是我在中需要它的情况;)
- @dvk:你是在一个先发制人的多任务操作系统上运行吗?或者是一个专门设计的Java芯片。如果是前者,则表示您处于并发环境中。其他进程可以从您的下面更改文件系统。
- @Kevin没关系,但它是一款专为个人使用而设计的单线程应用程序。它的专用文件以某种方式被创建/更改的可能性非常低。
使用java.io.File:
1 2 3 4
| File f = new File(filePathString );
if(f. exists() && !f. isDirectory()) {
// do something
} |
- 有些情况下exists()将返回错误的结果。例如,使用NFS文件系统时,旧文件句柄存在问题:bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595它有点模糊,但在以前的生产代码中它是一些令人沮丧的bug的原因。
- 用if(f.isFile())代替。
- 记住使用filePathstring.trim()以避免空格
我建议使用isFile()而不是exists()。大多数情况下,您要检查路径是否指向文件,而不仅仅是文件是否存在。记住,如果您的路径指向一个目录,那么exists()将返回true。
1
| 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)。
在Java SE 7中使用NIO,
1 2 3 4 5 6 7 8 9 10 11
| 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,则无法验证文件的存在。(可能无法访问此路径)
您可以检查路径是目录还是常规文件。
1 2 3 4 5 6 7
| if (Files.isDirectory(path)) {
// path is directory
}
if (Files.isRegularFile(path)) {
// path is regular file
} |
请检查这个Java SE 7教程。
- 与new file(path).exists()相比,advatages是什么?对于佩林存在的检查
- @ RaHuknAE-Encx1·8比EDCOX1·9(从我测试的唯一计算机上的小基准:Windows Server 2012运行Java1.7.0y45 x64)要快得多。
- 我自己试过了,java.nio.file.Files.exists()比java.io.File.exists慢5倍。(Wi7 Java1.7.0y79-x86)
- 这也有一个缺点,即如果字符串无效,则paths.get将引发异常
使用Java 8:
1 2 3
| if(Files.exists(Paths.get(filePathString))) {
// do something
} |
- Files.exists()有两个论点。一般来说,你会想要像Files.exists(path, LinkOption.NOFOLLOW_LINKS )这样的东西。
- @Mikec我想知道在没有第二个参数的情况下调用哪个方法。文档甚至没有显示任何关于这个的信息。
- @powerflower:只有一个文件。exists()方法。如果不传递第二个参数,它仍然调用相同的方法。第二个参数是varargs变量,可以传递0个或多个linkoptions。
这不会创建物理文件。只创建类文件的对象。要实际创建文件,必须显式创建:
因此,可以使用f.exists()来检查该文件是否存在。
1
| f.isFile() && f.canRead() |
- Pearl的-e是否也确保应用程序"可以读取"文件?
实现这一点有多种方法。
为了生存。它可以是文件或目录。
1
| new File("/path/to/file"). exists(); |
检查文件
1 2
| File f = new File("/path/to/file");
if(f. exists() && f. isFile()) {} |
检查目录。
1 2
| File f = new File("/path/to/file");
if(f. exists() && f. isDirectory()) {} |
Java 7方式。
1 2 3 4 5
| 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文件存在"的第一次命中:
1 2 3 4 5 6 7 8
| 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"));
}
} |
- 不需要检查F!=空,然后检查f.exists,如果新关键字失败,将生成异常。
- 没有检查F!= NULL。f+(…)使用java.io.file.toString
- @实际上,它使用了处理空值的String.valueOf()。
不要。只要抓住FileNotFoundException.文件系统就必须测试文件是否存在。这两次都没有意义,有几个理由不这么做,例如:
- 加倍代码
- 定时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然,以及
- 事实上,正如这个问题的存在所表明的那样,你可能做了错误的测试,得到了错误的答案。
不要试图对系统进行二次猜测。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。
- 如果我想每小时检查一次,看看是否有一个文件被存放在一个直接的位置。我有一个webmethods项目,它必须检查特定文件是否已上载到特定驱动器。怎么做呢?假设我想每小时检查一次文件是否在那里。我可以用Java编写一个类,它可能是用某种类型的计时器来完成的。
- 捕获一个异常要花很多钱。在我的测试中,检查new file().exists()比捕获fileNotFoundException快10倍以上。所以,如果您有一个场景,在这个场景中通常预期文件会丢失(如磁盘缓存),那么异常是错误的。另外,第二种猜测系统很酷。
- @Gnawer您还没有解决我提出的任何问题;只有在无法打开文件时才会抛出异常;并且每小时发生一次的操作不需要进行微优化。你的最后一句话是胡说八道。
- @道格霍夫在你的情况下没有问题,因为你不试图做任何事情后,你检查存在。但运营商特别要求在开业前进行检查。在这种情况下,最好尝试/捕获打开的文件。
对我来说,把肖恩A.O.哈尼接受的答案和Cort3z的评论结合起来似乎是最好的解决方案。
使用了以下代码段:
1 2 3 4
| File f = new File(filePathString );
if(f. exists() && f. isFile()) {
//do something ...
} |
希望这能帮助别人。
我知道我有点晚了。不过,这是我的答案,自Java 7和UP生效。
以下代码段
1 2 3
| if(Files.isRegularFile(Paths.get(pathToFile))) {
// do something
} |
是完全满足的,因为如果文件不存在,方法isRegularFile返回false。因此,不需要检查Files.exists(...)是否存在。
请注意,其他参数是指示如何处理链接的选项。默认情况下,符号链接后面跟着。
从Java Oracle文档
- From声纳文件:The files.exists method has notifeably poor performance in JDK 8,and can slow an application significantly when they used to check files that don't actually exist.The same goes for EDOCX1 penal 0,welcx1,welcx1 and EDOCX1 commercial 2.The best alternative to this is:weocx1 penal 3.
同样值得熟悉commons fileutils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/fileutils.html这有额外的文件管理方法,而且通常比JDK更好。
- 别回答这个问题。我同意下议院有很多有用的东西,但是也许我们可以更进一步,回答下议院提出的问题。
- 他给了我足够的答复。
例如,如果您有一个文件目录,并且想要检查它是否存在
1 2 3
| File tmpDir = new File("/var/tmp");
boolean exists = tmpDir. exists(); |
如果文件不存在,exists将返回false
来源:https://alvinalexander.com/java/java-file-exists-directory-exists
具有良好编码实践并涵盖所有案例的简单示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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-implements
1
| new File("/path/to/file"). exists(); |
会成功的
不要将文件构造函数与字符串一起使用。这可能不起作用!而不是使用此URI:
1 2 3 4
| File f = new File(new URI ("file:///"+filePathString. replace('\', '/')));
if(f.exists() && !f.isDirectory()) {
// to do
} |
- 它不是用绳子工作的,我想知道为什么?
- 可能不工作为什么不?那么如何使用一个URI来修复这个问题呢?
- 我们有个问题。f.exists()为真,我们甚至可以获取文件内容。问题是,路径错误,但文件名正常,即使这是另一个文件。使用uri更改构造函数调用,修复了问题。
File.exists()要检查文件是否存在,它将返回一个布尔值来指示检查操作状态;如果文件存在,则返回true;如果文件不存在,则返回false。
1 2 3 4 5 6 7
| File f = new File("c:\\test.txt");
if(f. exists()){
System. out. println("File existed");
}else{
System. out. println("File not found!");
} |
如果您想在目录中检查
dir中的
File
1 2
| String directoryPath = dir. getAbsolutePath()
boolean check = new File(new File(directoryPath ), aFile. getName()). exists(); |
检查check结果
您可以使用以下代码进行检查:
1 2 3 4 5 6 7 8 9 10 11 12
| import java.io.File;
class Test {
public static void main (String[] args ){
File f = new File(args [0]); //file name will be entered by user at runtime
System. out. println(f. exists()); //will print"true" if the file name given by user exists, false otherwise
if(f. exists())
{
//executable code;
}
}
} |
你可以这样做
1 2 3 4 5 6
| import java.nio.file.Paths;
String file ="myfile.sss";
if(Paths. get(file ). toFile(). isFile()){
//...do somethinh
} |
若要检查文件是否存在,只需导入java.
1 2 3 4 5 6 7
| File f = new File("C:\\File Path");
if(f. exists()){
System. out. println("Exists"); //if file exists
}else{
System. out. println("Doesn't exist"); //if file doesn't exist
} |
来源:http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/
- This adds nothing.你在许多问题上说了什么?请不要生产噪音。