Reputation:
If I do this:
File f = new File("c:\\text.txt");
if (f.exists()) {
System.out.println("File exists");
} else {
System.out.println("File not found!");
}
Then the file gets created and always returns "File exists". Is it possible to check if a file exists without creating it?
EDIT:
I forgot to mention that it's in a for loop. So here's the real thing:
for (int i = 0; i < 10; i++) {
File file = new File("c:\\text" + i + ".txt");
System.out.println("New file created: " + file.getPath());
}
Upvotes: 27
Views: 90020
Reputation: 1
As of Java 11, any of these code snippets that use Paths.get("some_path")
do not work, as the Paths.get()
call actually creates the directory (at least in Windows), so the return value of, for example, Paths.get("some_path").toFile().exists()
is immediately outdated as soon as it is generated.
Upvotes: 0
Reputation: 382454
When you instantiate a File
, you're not creating anything on disk but just building an object on which you can call some methods, like exists()
.
That's fine and cheap, don't try to avoid this instantiation.
The File
instance has only two fields:
private String path;
private transient int prefixLength;
And here is the constructor :
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
As you can see, the File
instance is just an encapsulation of the path. Creating it in order to call exists()
is the correct way to proceed. Don't try to optimize it away.
Upvotes: 54
Reputation: 71
The Files.exists method has noticeably poor performance in JDK 8, and can slow an application significantly when used to check files that don't actually exist.
This can be applied too for Files.noExists, Files.isDirectory and Files.isRegularFile
According this you can use the following :
Paths.get("file_path").toFile().exists()
Upvotes: 3
Reputation: 56714
Starting from Java 7 you can use java.nio.file.Files.exists
:
Path p = Paths.get("C:\\Users\\first.last");
boolean exists = Files.exists(p);
boolean notExists = Files.notExists(p);
if (exists) {
System.out.println("File exists!");
} else if (notExists) {
System.out.println("File doesn't exist!");
} else {
System.out.println("File's status is unknown!");
}
In the Oracle tutorial you can find some details about this:
The methods in the
Path
class are syntactic, meaning that they operate on thePath
instance. But eventually you must access the file system to verify that a particularPath
exists, or does not exist. You can do so with theexists(Path, LinkOption...)
and thenotExists(Path, LinkOption...)
methods. Note that!Files.exists(path)
is not equivalent toFiles.notExists(path)
. When you are testing a file's existence, three results are possible:
- The file is verified to exist.
- The file is verified to not exist.
- The file's status is unknown. This result can occur when the program does not have access to the file.
If both
exists
andnotExists
returnfalse
, the existence of the file cannot be verified.
Upvotes: 14
Reputation: 122001
Creating a File
instance does not create a file on the file system, so the posted code will do what you require.
Upvotes: 11