Hoe scan ik een map in Java?

Hoe kan ik recursief een lijst krijgen van alle bestanden in een map in Java?


Antwoord 1, autoriteit 100%

Weet u niet zeker hoe u de boom wilt weergeven? Hoe dan ook, hier is een voorbeeld dat de hele substructuur scant met behulp van recursie. Bestanden en mappen worden gelijk behandeld. Merk op dat File.listFiles() geeft null terug voor niet-directories.

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 biedt een aantal verbeteringen. Bijvoorbeeld DirectoryStreamlevert één resultaat tegelijk – de beller hoeft niet langer te wachten tot alle I/O-bewerkingen zijn voltooid voordat hij actie onderneemt. Dit maakt incrementele GUI-updates, vroegtijdige annulering, enz. mogelijk.

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);
            }
        }
    }
}

Merk op dat de gevreesde null-retourwaarde is vervangen door IOException.

Java 7 biedt ook een bomenwandelaar:

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;
        }
    });
}

Antwoord 2, autoriteit 31%

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() );
        }
    }
}

Het geeft onduidelijke bestanden en mappen weer.

Bekijk de methoden in de bestandsklasse om ze te ordenen of het afdrukken van mappen enz. te vermijden.

http://java.sun.com/ javase/6/docs/api/java/io/File.html


Antwoord 3, autoriteit 8%

U kunt ook de FileFilter-interface om uit te filteren wat u wilt. Het wordt het best gebruikt wanneer u een anonieme klasse maakt die het implementeert:

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();
            }});
    }
}

Antwoord 4, autoriteit 4%

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);        
    }
} 

Hier diris de map die moet worden gescand. bijv. c:\


Antwoord 5

Het visualiseren van de boomstructuur was voor mij de handigste manier :

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;
}

Antwoord 6

In JDK7 zouden “meer NIO-functies” methoden moeten hebben om het bezoekerspatroon toe te passen op een bestandsstructuur of alleen op de onmiddellijke inhoud van een map – het is niet nodig om alle bestanden in een potentieel enorme map te vinden voordat ze worden herhaald.

Other episodes