7 ответов:
не знаете, как вы хотите представить дерево? В любом случае вот пример который сканирует все поддерево с помощью рекурсии. Файлы и каталоги обрабатываются одинаково. Обратите внимание, что .файл-список() возвращает 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); } } } }обратите внимание, что страшное нулевое возвращаемое значение было заменено 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; } }); }
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, чтобы упорядочить их или избежать печати каталога и т. д.
проверить Апач Викискладе пакета fileutils (файл-список, iterateFiles и т. д.). Хорошие удобные методы для того, чтобы делать то, что вы хотите, а также применять фильтры.
http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html
вы также можете использовать
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(); }}); } }
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:\
визуализация структуры дерева была для меня самым удобным способом:
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; }
в JDK7 "дополнительные функции NIO" должны иметь методы для применения шаблона посетителя к файловому дереву или просто к непосредственному содержимому каталога - нет необходимости находить все файлы в потенциально огромном каталоге перед их повторением.
Comments