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

How do I iterate through the files in a directory and it's sub-directories in Java?

Как мне выполнить итерацию по файлам в каталоге и его подкаталогам в Java?

Мне нужно получить список всех файлов в каталоге, включая файлы во всех подкаталогах. Каков стандартный способ выполнения итерации каталога с Java?

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

Вы можете использовать File#isDirectory(), чтобы проверить, является ли данный файл (путь) каталогом. Если это так true, то вы просто снова вызываете тот же метод с его File#listFiles() результатом. Это называется рекурсией.

Вот базовый начальный пример:

package com.stackoverflow.q3154488;

import java.io.File;

public class Demo {

public static void main(String... args) {
File dir = new File("/path/to/dir");
showFiles(dir.listFiles());
}

public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getAbsolutePath());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getAbsolutePath());
}
}
}
}

Обратите внимание, что это чувствительно к StackOverflowError когда дерево глубже, чем может вместить стек JVM. Если вы уже используете Java 8 или новее, то вам лучше использовать Files#walk() вместо этого который использует хвостовую рекурсию:

package com.stackoverflow.q3154488;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DemoWithJava8 {

public static void main(String... args) throws Exception {
Path dir = Paths.get("/path/to/dir");
Files.walk(dir).forEach(path -> showFile(path.toFile()));
}

public static void showFile(File file) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getAbsolutePath());
} else {
System.out.println("File: " + file.getAbsolutePath());
}
}
}
Ответ 2

Если вы используете Java 1.7, вы можете использовать java.nio.file.Files.walkFileTree(...).

Например:

public class WalkFileTreeExample {

public static void main(String[] args) {
Path p = Paths.get("/usr");
FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
};

try {
Files.walkFileTree(p, fv);
} catch (IOException e) {
e.printStackTrace();
}
}

}

Если вы используете Java 8, вы можете использовать интерфейс stream с java.nio.file.Files.walk(...):

public class WalkFileTreeExample {

public static void main(String[] args) {
try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}

}
Ответ 3

Ознакомьтесь с классом FileUtils в Apache Commons, в частности с iterateFiles:


Позволяет выполнять итерацию по файлам в данном каталоге (и, необязательно, по его подкаталогам).


Ответ 4

Используя org.apache.commons.io.FileUtils

File file = new File("F:/Lines");       
Collection<File> files = FileUtils.listFiles(file, null, true);
for(File file2 : files){
System.out.println(file2.getName());
}

Используйте false, если вам не нужны файлы из подкаталогов.

java