lista wszystkich plików z katalogów i podkatalogów w Javie

Jaki byłby najszybszy sposób na wyświetlenie nazw plików z ponad 1000 katalogów i podkatalogów?

Edytuj; Obecny kod, którego używam to:

import java.io.File;

public class DirectoryReader {

  static int spc_count=-1;

  static void Process(File aFile) {
    spc_count++;
    String spcs = "";
    for (int i = 0; i < spc_count; i++)
      spcs += " ";
    if(aFile.isFile())
      System.out.println(spcs + "[FILE] " + aFile.getName());
    else if (aFile.isDirectory()) {
      System.out.println(spcs + "[DIR] " + aFile.getName());
      File[] listOfFiles = aFile.listFiles();
      if(listOfFiles!=null) {
        for (int i = 0; i < listOfFiles.length; i++)
          Process(listOfFiles[i]);
      } else {
        System.out.println(spcs + " [ACCESS DENIED]");
      }
    }
    spc_count--;
  }

  public static void main(String[] args) {
    String nam = "D:/";
    File aFile = new File(nam);
    Process(aFile);
  }

}
Author: danben, 2010-06-09

6 answers

Wygląda to dobrze (rekurencyjnie przechodząc przez katalog) wąskim gardłem będą wszystkie wejścia/wyjścia plików, które musisz zrobić, optymalizacja Javy nie pokaże żadnych rzeczywistych ulepszeń.

 9
Author: Romain Hippeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 17:14:44

Ponieważ ta odpowiedź pojawia się na górze google, dodaję rozwiązanie java 7 nio do listowania wszystkich plików i katalogów, zajmuje to około 80% mniej czasu w moim systemie.

try {
    Path startPath = Paths.get("c:/");
    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir,
                BasicFileAttributes attrs) {
            System.out.println("Dir: " + dir.toString());
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            System.out.println("File: " + file.toString());    
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException e) {
            return FileVisitResult.CONTINUE;
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}
 33
Author: Aksel Willgert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-27 08:14:05

Jedyną poprawą jest pozbycie się static spc_count i przekazanie spcs string jako parametru do przetworzenia.

public static void main(String[] args) {
  String nam = "D:/";
  File aFile = new File(nam);
  Process("", aFile);
}

I wykonując wywołanie rekurencyjne, wykonuj

static void Process( String spcs, File aFile) {
  ...
  Process(spcs + " ", listOfFiles[i]);
  ...
}

W ten sposób można wywołać tę metodę z więcej niż 1 wątku.

 5
Author: Alexander Pogrebnyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 18:22:14

Dopóki Java 7 nie wprowadzi nowej Javy.nio.klas pliku (Jak DirectoryStream), obawiam się, że to, co już masz, będzie najszybsze.

 4
Author: Powerlord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 17:22:08

Jeśli jesteś otwarty na korzystanie z biblioteki innej firmy, sprawdź javaxt-core . Zawiera on wielowątkowe rekurencyjne wyszukiwanie katalogów, które powinno być szybsze niż iteracja przez jeden katalog na raz. Oto kilka przykładów:

Http://www.javaxt.com/javaxt-core/io/Directory/Recursive_Directory_Search

 3
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 18:24:35

Napisałem znacznie prostszy kod....Spróbuj tego... Wyświetli każdy folder, podfoldery i pliki...

 int Files=0,Directory=0,HiddenFiles=0,HiddenDirectory=0;

 public void listf(String directoryName){

File file=new File(directoryName);

File[] fileList=file.listFiles();

if(fileList!=null){

for(int i=0;i<fileList.length;i++){

if(fileList[i].isHidden()){

if(fileList[i].isFile())

{

   System.out.println(fileList[i]);

HiddenFiles++;

}

else{

  listf(String.valueOf(fileList[i]));

  HiddenDirectory++;

}

}

else if (fileList[i].isFile()) {

//System.out.println(fileList[i]);

Files++;

}

else if(fileList[i].isDirectory()){

Directory++;

listf(String.valueOf(fileList[i]));

}

}

}

}



public void Numbers(){

   System.out.println("Files: "+Files+" HiddenFiles: "+HiddenFiles+"Hidden Directories"+HiddenDirectory+" Directories: "+Directory);`

    }  
 0
Author: user3423267,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 05:12:59