Проверьте, существует ли файл без его создания.
Если я это сделаю:
File f = new File("c:\\text.txt");
if (f.exists()) {
System.out.println("File exists");
} else {
System.out.println("File not found!");
}
Затем файл создается и всегда возвращает "Файл существует". Можно ли проверить, существует ли файл без его создания?
EDIT:
Я забыл упомянуть, что это в цикле for. Итак, вот настоящая вещь:
for (int i = 0; i < 10; i++) {
File file = new File("c:\\text" + i + ".txt");
System.out.println("New file created: " + file.getPath());
}
Ответы
Ответ 1
Когда вы создаете экземпляр File
, вы не создаете что-либо на диске, а просто создаете объект, для которого вы можете вызывать некоторые методы, такие как exists()
.
Это хорошо и дешево, не пытайтесь избежать этого создания.
Экземпляр File
имеет только два поля:
private String path;
private transient int prefixLength;
А вот и конструктор:
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
Как видите, экземпляр File
- это просто инкапсуляция пути. Создание его для вызова exists()
- правильный путь для продолжения. Не пытайтесь оптимизировать это.
Ответ 2
Создание экземпляра File
не создает файл в файловой системе, поэтому размещенный код будет делать то, что вам нужно.
Ответ 3
Начиная с Java 7 вы можете использовать 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 status is unknown!");
}
В руководстве по Oracle вы можете найти некоторые подробности об этом:
Методы в классе Path
являются синтаксическими, то есть они работают с экземпляром Path
. Но в конечном итоге вы должны получить доступ к файловой системе, чтобы убедиться, что определенный Path
существует или не существует. Это можно сделать с помощью exists(Path, LinkOption...)
и notExists(Path, LinkOption...)
. Обратите внимание, что !Files.exists(path)
не эквивалентен Files.notExists(path)
. Когда вы проверяете существование файла, возможны три результата:
- Файл проверен на существование.
- Файл проверен на отсутствие.
- Статус файла неизвестен. Этот результат может возникнуть, когда программа не имеет доступа к файлу.
Если оба exists
и notExists
возвращает false
, существование файла невозможно проверить.
Ответ 4
Метод Files.exists заметно снижает производительность в JDK 8 и может значительно замедлить работу приложения, когда используется для проверки файлов, которые на самом деле не существуют.
Это также может быть применено для файлов Files.noExists, Files.isDirectory и Files.isRegularFile.
В соответствии с этим вы можете использовать следующее:
Paths.get("file_path").toFile().exists()