



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, чтобы упорядочить их или избежать печати каталога и т. д.
Ознакомьтесь с Apache Commons FileUtils (listFiles, iterateFiles и т. д.). Хорошие удобные методы для того, чтобы делать то, что вы хотите, а также применять фильтры.
http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html
Нет ничего лучше, чем втягивать гигантскую библиотеку для решения проблемы медленнее, чем в противном случае можно было бы решить с помощью 10 строк кода.
Я ненавижу использовать библиотеки, которые были протестированы настолько, что они содержат функции длиной более 10 строк.
Не знаете, как вы хотите изобразить дерево? В любом случае, вот пример, который сканирует все поддерево с помощью рекурсии. Файлы и каталоги обрабатываются одинаково. Обратите внимание, что 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 также предлагает ходок по деревьям:
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;
}
});
}
Да это как повторяющийся кошмар ..: P ~
Я должен принять этот ответ, так как я попросил дерево (сначала я принял ответ Оскара Рейеса) .. хотя добавить еще одну строку для рекурсии было не так уж сложно :)
В JDK7 «дополнительные функции NIO» должны иметь методы для применения шаблона посетителя к дереву файлов или только к непосредственному содержимому каталога - нет необходимости находить все файлы в потенциально огромном каталоге перед их итерацией.
но NIO быстрее?
@Pacerier Для небольших каталогов это не должно иметь большого значения. Сейчас я еще менее знаком с реализацией, чем девять лет назад, но потоковый NIO должен лучше справляться с каталогами массивный, чем читать все сразу. При этом память теперь будет дешевле в несколько десятков раз.
Вы также можете использовать интерфейс 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 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;
}
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:\
что вы имеете в виду под ДЕРЕВО? пожалуйста, перефразируйте свой вопрос, если вы ищете метод для СПИСОК всех файлов в папке (рекурсивно).