Как я могу получить список всех файлов в папке рекурсивно в Java?
Как сканировать папку на Java?
Ответ 1
Не знаете, как вы хотите представлять дерево? Во всяком случае здесь пример, который сканирует все поддерево, используя рекурсию. Файлы и каталоги обрабатываются одинаково. Обратите внимание, что File.listFiles() возвращает null для не-каталогов.
public static void main(String[] args) {
Collection<File> all = new ArrayList<File>();
addTree(new File("."), all);
System.out.println(all);
}
static void addTree(File file, Collection<File> all) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
all.add(child);
addTree(child, all);
}
}
}
Java 7 предлагает несколько улучшений. Например, DirectoryStream предоставляет один результат за раз - вызывающему абоненту больше не нужно ждать завершения всех операций ввода-вывода до начала действия. Это позволяет инкрементные обновления графического интерфейса пользователя, раннее аннулирование и т.д.
static void addTree(Path directory, Collection<Path> all)
throws IOException {
try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) {
for (Path child : ds) {
all.add(child);
if (Files.isDirectory(child)) {
addTree(child, all);
}
}
}
}
Обратите внимание, что искомое исходное значение null заменено на IOException.
Java 7 также предлагает tree walker:
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
}
Ответ 2
import java.io.File;
public class Test {
public static void main( String [] args ) {
File actual = new File(".");
for( File f : actual.listFiles()){
System.out.println( f.getName() );
}
}
}
Он отображает нечеткие файлы и папки.
Обратитесь к методам в классе File, чтобы заказать их, или не печатать каталог и т.д.
Ответ 3
Проверьте Apache Commons FileUtils (listFiles, iterateFiles и т.д.). Хорошие удобные методы для выполнения того, что вы хотите, а также применения фильтров.
http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html
Ответ 4
Вы также можете использовать FileFilter
для фильтрации того, что вы хотите. Он лучше всего используется при создании анонимного класса, который его реализует:
import java.io.File;
import java.io.FileFilter;
public class ListFiles {
public File[] findDirectories(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory();
}});
}
public File[] findFiles(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isFile();
}});
}
}
Ответ 5
public static void directory (File dir) {
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
if (file.listFiles() != null)
directory(file);
}
}
Здесь dir - это каталог, который нужно отсканировать. например c:\
Ответ 6
Визуализация древовидной структуры была наиболее удобным для меня способом:
public static void main(String[] args) throws IOException {
printTree(0, new File("START/FROM/DIR"));
}
static void printTree(int depth, File file) throws IOException {
StringBuilder indent = new StringBuilder();
String name = file.getName();
for (int i = 0; i < depth; i++) {
indent.append(".");
}
//Pretty print for directories
if (file.isDirectory()) {
System.out.println(indent.toString() + "|");
if(isPrintName(name)){
System.out.println(indent.toString() + "*" + file.getName() + "*");
}
}
//Print file name
else if(isPrintName(name)) {
System.out.println(indent.toString() + file.getName());
}
//Recurse children
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++){
printTree(depth + 4, files[i]);
}
}
}
//Exclude some file names
static boolean isPrintName(String name){
if (name.charAt(0) == '.') {
return false;
}
if (name.contains("svn")) {
return false;
}
//.
//. Some more exclusions
//.
return true;
}
Ответ 7
В JDK7 "больше возможностей NIO" должны иметь методы применения шаблона посетителя по дереву файлов или просто к непосредственному содержимому каталога - нет необходимости находить все файлы в потенциально огромном каталоге перед их итерацией по ним.