Вопрос-ответ

How to read all files in a folder from Java?

Как я могу прочитать все файлы в папке из Java?

Как я могу прочитать все файлы в папке с помощью Java? Не имеет значения, какой API.

Переведено автоматически
Ответ 1

Использование:

public void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {
System.out.println(fileEntry.getName());
}
}
}

final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);

API Files.walk доступен с Java 8.

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
paths
.filter(Files::isRegularFile)
.forEach(System.out::println);
}

В примере используется шаблон try-with-resources, рекомендованный в руководстве по API. Это гарантирует, что поток будет закрыт независимо от обстоятельств.

Ответ 2
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
if (file.isFile()) {
System.out.println(file.getName());
}
}
Ответ 3

В Java 8 вы можете это сделать

Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);

который напечатает все файлы в папке, исключая все каталоги. Если вам нужен список, подойдет следующее:

Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.collect(Collectors.toList())

Если вы хотите вернуть List<File> вместо List<Path> просто сопоставить это:

List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.collect(Collectors.toList());

Вам также необходимо убедиться, что вы закрыли поток! В противном случае вы можете столкнуться с исключением, сообщающим вам, что открыто слишком много файлов. Прочитайте здесь для получения дополнительной информации.

Ответ 4

Во всех ответах по этой теме, в которых используются новые функции Java 8, игнорируется закрытие потока. Пример в принятом ответе должен быть:

try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
filePathStream.forEach(filePath -> {
if (Files.isRegularFile(filePath)) {
System.out.println(filePath);
}
});
}

Из javadoc Files.walk метода:


Возвращаемый поток инкапсулирует один или несколько DirectoryStreams. Если требуется своевременное удаление ресурсов файловой системы, следует использовать конструкцию try-with-resources, чтобы гарантировать, что метод закрытия потока вызывается после завершения потоковых операций.


java file