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