Ich stimme zu, weisen Sie auf die zu verwendende Klasse hin, damit das Poster mit den verschiedenen Methoden vertraut wird. Andernfalls macht sich das Poster nicht die Mühe, die API zu lesen, um herauszufinden, welche anderen Methoden verfügbar sind.
Camickr
5
Meinten Sie alle Dateien in einem Ordner oder alle Dateien in einem Ordner und alle Unterordner?
In diesem Beispiel wird das im API-Handbuch empfohlene Try-with-Resources- Muster verwendet. Es stellt sicher, dass der Stream unabhängig von den Umständen geschlossen wird.
getName()gibt nur den Namen der Datei in ihrem Verzeichnis an, das ein Unterverzeichnis des Originals sein könnte. Wenn Sie diese Informationen zum Auffinden der Dateien verwenden möchten, ist der angegebene Pfad möglicherweise getPath()nützlicher.
Tim Parenti
4
Kann ich mit dieser Methode alle Dateien eines bestimmten Typs, z. B. PDF oder HTML, auf meinem gesamten System finden? Mein Anliegen ist die Effizienz, ist es schnell genug, um für Systeme mit Tausenden von Dateien verwendet zu werden, oder gibt es eine bessere Alternative?
Nitin Labhishetty
@codeln Ab Java 8 ist die Leistung sehr akzeptabel, Sie bemerken nichts Verzögerendes daran. Es ist schnell, effizient und lesbar genug, um Ihre Arbeit zu erledigen.
Tom_mai78101
17
In Java 8 können Sie die filterMethode auch verwenden. Dann wird forEach nicht mehr benötigt. Siehe hier -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Nur um anzuzeigen, dass es nur einmal initialisiert wurde.
Dadurch werden alle Dateien in einem Ordner gedruckt, wobei alle Verzeichnisse ausgeschlossen werden. Wenn Sie eine Liste benötigen, reicht Folgendes aus:
Sie müssen auch sicherstellen, dass der Stream geschlossen wird! Andernfalls tritt möglicherweise eine Ausnahme auf, die Sie darüber informiert, dass zu viele Dateien geöffnet sind. Lesen Sie hier für weitere Informationen.
Fehler mit .map (Path :: toFile) erhalten Auch .forEach (Pfad -> System.out.println (path.toString ()); sollte .forEach (Pfad -> System.out.println (path.toString () sein) )));
XaolingBao
2
Es heißt "Ungültige Methodenreferenz, Symbol kann nicht gefunden werden" "Methode toFile" soll toFile etwas anderes sein?
XaolingBao
2
Können Sie bitte Ihren Code in einen PasteBin einfügen? Sind Sie mit java.nio.file.Path? Ich habe gerade überprüft, ob die Methode toFile () auch vor Java 8 existieren sollte -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Alle Antworten zu diesem Thema, die die neuen Java 8-Funktionen verwenden, vernachlässigen das Schließen des Streams. Das Beispiel in der akzeptierten Antwort sollte sein:
Der zurückgegebene Stream kapselt einen oder mehrere DirectoryStreams. Wenn eine rechtzeitige Entsorgung von Dateisystemressourcen erforderlich ist, sollte das Try-with-Resources-Konstrukt verwendet werden, um sicherzustellen, dass die Abschlussmethode des Streams nach Abschluss der Stream-Vorgänge aufgerufen wird.
Sie sollten niemals mit Stream iterieren. Sie nehmen eine Stream-Referenz, verwenden sie und entfernen sie.
Rudolf Schmidt
@ RudolfSchmidt meinst du "wegwerfen"?
Roland
1
Ich meine, der richtige Weg ist, es so zu verwenden: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Rudolf Schmidt
12
import java.io.File;publicclassReadFilesFromFolder{publicstaticFile folder =newFile("C:/Documents and Settings/My Documents/Downloads");staticString temp ="";publicstaticvoid main(String[] args){// TODO Auto-generated method stubSystem.out.println("Reading files under the folder "+ folder.getAbsolutePath());
listFilesForFolder(folder);}publicstaticvoid listFilesForFolder(finalFile folder){for(finalFile fileEntry : folder.listFiles()){if(fileEntry.isDirectory()){// System.out.println("Reading files under the folder "+folder.getAbsolutePath());
listFilesForFolder(fileEntry);}else{if(fileEntry.isFile()){
temp = fileEntry.getName();if((temp.substring(temp.lastIndexOf('.')+1, temp.length()).toLowerCase()).equals("txt"))System.out.println("File= "+ folder.getAbsolutePath()+"\\"+ fileEntry.getName());}}}}}
Willkommen zu ! Erklären Sie bitte , warum dieser Code das aufgeworfene Problem löst , anstatt nur einen Codeblock zu veröffentlichen . Ohne eine Erklärung ist dies keine Antwort.
Martijn Pieters
Einverstanden, nur das Posten eines Codeblocks funktioniert nicht. Bitte fügen Sie mindestens einige Kommentare in den Code ein ...
Ashraf.Shk786
Dies ist ebenso guter Code, er kann auch Dateien in Unterverzeichnissen eines Ordners lesen.
Mimouni
11
privatestaticfinalString ROOT_FILE_PATH="/";File f=newFile(ROOT_FILE_PATH);File[] allSubFiles=f.listFiles();for(File file : allSubFiles){if(file.isDirectory()){System.out.println(file.getAbsolutePath()+" is directory");//Steps for directory}else{System.out.println(file.getAbsolutePath()+" is file");//steps for files}}
Path dir =...;try(DirectoryStream<Path> stream =Files.newDirectoryStream(dir)){for(Path file: stream){System.out.println(file.getFileName());}}catch(IOException|DirectoryIteratorException x){// IOException can never be thrown by the iteration.// In this snippet, it can only be thrown by newDirectoryStream.System.err.println(x);}
Sie können auch einen Filter erstellen, der dann an die newDirectoryStreamobige Methode übergeben werden kann
DirectoryStream.Filter<Path> filter =newDirectoryStream.Filter<Path>(){publicboolean accept(Path file)throwsIOException{try{return(Files.isRegularFile(path));}catch(IOException x){// Failed to determine if it's a file.System.err.println(x);returnfalse;}}};
Das Beispiel zum Erstellen eines Filters verwirrt mich. Was ist newDirectoryStream.Filter <Pfad>? Können Sie zeigen, wie das deklariert wird?
Simgineer
Ich glaube, ich habe es herausgefunden. Es ist ein Tippfehler zum Kopieren und Einfügen. Zwischen "new" und "DirectoryStream.Filter ..." befindet sich ein Leerzeichen. Wenn ich recht habe, empfehlen Sie, Ihr Beispiel zu korrigieren.
Simgineer
9
Eine Bemerkung laut bekommen alle Dateien im Verzeichnis.
Die MethodeFiles.walk(path) gibt alle Dateien zurück, indem sie den Dateibaum durchläuft, der in der angegebenen gestarteten Datei verwurzelt ist.
Beachten Sie , dass dieser Code eine Ausnahme auslösen wird (und nicht melden Sie alle weiteren Dateien) , wenn für einige Datei oder das Verzeichnis der Dateiattribute nicht gelesen werden konnte, zum Beispiel aufgrund von Berechtigungen. Einfach auf "C:" zu reproduzieren.
Thomas S.
5
Wenn Sie weitere Optionen wünschen, können Sie diese Funktion verwenden, um eine Arrayliste der in einem Ordner vorhandenen Dateien zu füllen. Folgende Optionen stehen zur Verfügung: Rekursivität und Muster.
publicstaticArrayList<File> listFilesForFolder(finalFile folder,finalboolean recursivity,finalString patternFileFilter){// Inputsboolean filteredFile =false;// OuputfinalArrayList<File> output =newArrayList<File>();// Foreach elementsfor(finalFile fileEntry : folder.listFiles()){// If this element is a directory, do it recursivlyif(fileEntry.isDirectory()){if(recursivity){
output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));}}else{// If there is no pattern, the file is correctif(patternFileFilter.length()==0){
filteredFile =true;}// Otherwise we need to filter by patternelse{
filteredFile =Pattern.matches(patternFileFilter, fileEntry.getName());}// If the file has a name which match with the pattern, then add it to the listif(filteredFile){
output.add(fileEntry);}}}return output;}
Möglicherweise möchten Sie eine Erklärung hinzufügen, was Sie erreichen möchten, anstatt nur Code anzuzeigen. Außerdem myarray=new File[10];ist dies nicht erforderlich, da es in der nächsten Zeile überschrieben wird!
docs.oracle.com/javase/7/docs/api/java/io/… public File [] listFiles () Gibt ein Array abstrakter Pfadnamen zurück, die die Dateien in dem Verzeichnis angeben, das durch diesen abstrakten Pfadnamen gekennzeichnet ist.
andrej
3
staticFile mainFolder =newFile("Folder");publicstaticvoid main(String[] args){
lf.getFiles(lf.mainFolder);}publicvoid getFiles(File f){File files[];if(f.isFile()){String name=f.getName();}else{
files = f.listFiles();for(int i =0; i < files.length; i++){
getFiles(files[i]);}}}
Während ich Rich, Orian und den anderen zustimme, verwenden sie:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
Aus irgendeinem Grund verwenden alle Beispiele hier den absoluten Pfad (dh den gesamten Weg von root oder beispielsweise den Laufwerksbuchstaben (C: \) für Windows.)
Ich möchte hinzufügen, dass es möglich ist, auch den relativen Pfad zu verwenden . Wenn Sie also pwd (aktuelles Verzeichnis / Ordner) Ordner1 ist und Ordner1 / Unterordner analysieren möchten, schreiben Sie einfach (im obigen Code anstelle von):
Um die akzeptierte Antwort zu erweitern, speichere ich die Dateinamen in einer ArrayList (anstatt sie nur in System.out.println abzulegen). Ich habe eine Hilfsklasse "MyFileUtils" erstellt, damit sie von anderen Projekten importiert werden kann:
Die ArrayList wird von "value" übergeben, aber der Wert wird verwendet, um auf dasselbe ArrayList-Objekt zu verweisen, das sich im JVM-Heap befindet. Auf diese Weise fügt jeder Rekursionsaufruf Dateinamen zur gleichen ArrayList hinzu (wir erstellen NICHT bei jedem rekursiven Aufruf eine neue ArrayList).
Sie können den Dateipfad zum Argument setzen und eine Liste mit allen Dateipfaden erstellen und nicht manuell in die Liste einfügen. Verwenden Sie dann eine for-Schleife und einen Reader. Beispiel für txt-Dateien:
Listen Sie die Dateien aus dem Testordner auf, die im Klassenpfad vorhanden sind
import java.io.File;import java.io.IOException;publicclassHello{publicstaticvoid main(finalString[] args)throwsIOException{System.out.println("List down all the files present on the server directory");File file1 =newFile("/prog/FileTest/src/Test");File[] files = file1.listFiles();if(null!= files){for(int fileIntList =0; fileIntList < files.length; fileIntList++){String ss = files[fileIntList].toString();if(null!= ss && ss.length()>0){System.out.println("File: "+(fileIntList +1)+" :"+ ss.substring(ss.lastIndexOf("\\")+1, ss.length()));}}}}}
/**
* Function to read all mp3 files from sdcard and store the details in an
* ArrayList
*/publicArrayList<HashMap<String,String>> getPlayList(){ArrayList<HashMap<String,String>> songsList=newArrayList<>();File home =newFile(MEDIA_PATH);if(home.listFiles(newFileExtensionFilter()).length >0){for(File file : home.listFiles(newFileExtensionFilter())){HashMap<String,String> song =newHashMap<String,String>();
song.put("songTitle",
file.getName().substring(0,(file.getName().length()-4)));
song.put("songPath", file.getPath());// Adding each song to SongList
songsList.add(song);}}// return songs list arrayreturn songsList;}/**
* Class to filter files which have a .mp3 extension
* */classFileExtensionFilterimplementsFilenameFilter{@Overridepublicboolean accept(File dir,String name){return(name.endsWith(".mp3")|| name.endsWith(".MP3"));}}
Sie können beliebige Textdateien oder andere Erweiterungen filtern. Ersetzen Sie sie einfach durch .MP3
Oben gibt es viele gute Antworten. Hier ist ein anderer Ansatz: In einem Maven-Projekt wird alles, was Sie in den Ressourcenordner legen, standardmäßig in den Ordner target / classes kopiert. Um zu sehen, was zur Laufzeit verfügbar ist
Um die Dateien aus einem bestimmten Ordner abzurufen, nehmen wir an, Sie haben einen Ordner mit dem Namen "res" in Ihrem Ressourcenordner. Ersetzen Sie einfach:
Tut mir leid, wenn dies eine Noob-Frage ist, aber was soll ich als files container?
Pramesh Bajracharya
0
Dies wird gut funktionieren:
privatestaticvoid addfiles(File inputValVal,ArrayList<File> files){if(inputVal.isDirectory()){ArrayList<File> path =newArrayList<File>(Arrays.asList(inputVal.listFiles()));for(int i=0; i<path.size();++i){if(path.get(i).isDirectory()){
addfiles(path.get(i),files);}if(path.get(i).isFile()){
files.add(path.get(i));}}/* Optional : if you need to have the counts of all the folders and files you can create 2 global arrays
and store the results of the above 2 if loops inside these arrays */}if(inputVal.isFile()){
files.add(inputVal);}}
Files.walkFileTree
, finden Sie stackoverflow.com/a/23814217/1115554Antworten:
Die Files.walk- API ist in Java 8 verfügbar.
In diesem Beispiel wird das im API-Handbuch empfohlene Try-with-Resources- Muster verwendet. Es stellt sicher, dass der Stream unabhängig von den Umständen geschlossen wird.
quelle
getName()
gibt nur den Namen der Datei in ihrem Verzeichnis an, das ein Unterverzeichnis des Originals sein könnte. Wenn Sie diese Informationen zum Auffinden der Dateien verwenden möchten, ist der angegebene Pfad möglicherweisegetPath()
nützlicher.filter
Methode auch verwenden. Dann wird forEach nicht mehr benötigt. Siehe hier -> stackoverflow.com/a/26215931/1029251quelle
In Java 8 können Sie dies tun
Dadurch werden alle Dateien in einem Ordner gedruckt, wobei alle Verzeichnisse ausgeschlossen werden. Wenn Sie eine Liste benötigen, reicht Folgendes aus:
Wenn Sie zurückkehren möchten,
List<File>
anstatt esList<Path>
nur zuzuordnen:Sie müssen auch sicherstellen, dass der Stream geschlossen wird! Andernfalls tritt möglicherweise eine Ausnahme auf, die Sie darüber informiert, dass zu viele Dateien geöffnet sind. Lesen Sie hier für weitere Informationen.
quelle
java.nio.file.Path
? Ich habe gerade überprüft, ob die Methode toFile () auch vor Java 8 existieren sollte -> docs.oracle.com/javase/7/docs/api/java/nio/file/…Alle Antworten zu diesem Thema, die die neuen Java 8-Funktionen verwenden, vernachlässigen das Schließen des Streams. Das Beispiel in der akzeptierten Antwort sollte sein:
Aus dem Javadoc der
Files.walk
Methode:quelle
quelle
quelle
In Java 7 können Sie dies jetzt auf folgende Weise tun: http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir
Sie können auch einen Filter erstellen, der dann an die
newDirectoryStream
obige Methode übergeben werden kannAndere Filterbeispiele - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob
quelle
Eine Bemerkung laut bekommen alle Dateien im Verzeichnis.
Die Methode
Files.walk(path)
gibt alle Dateien zurück, indem sie den Dateibaum durchläuft, der in der angegebenen gestarteten Datei verwurzelt ist.Zum Beispiel gibt es den nächsten Dateibaum:
Verwenden der
java.nio.file.Files.walk(Path)
:Gibt das folgende Ergebnis:
Um alle Dateien nur im aktuellen Verzeichnis abzurufen, verwenden Sie Folgendes
java.nio.file.Files.list(Path)
:Ergebnis:
quelle
Files.list
Beispiel. Wenn Sie nicht rekursiv suchen möchten, kann dies manchmal die beste Option sein.Gehen Sie einfach mit
Files.walkFileTree
(Java 7) durch alle Dateien.quelle
Wenn Sie weitere Optionen wünschen, können Sie diese Funktion verwenden, um eine Arrayliste der in einem Ordner vorhandenen Dateien zu füllen. Folgende Optionen stehen zur Verfügung: Rekursivität und Muster.
Am besten, Adrien
quelle
quelle
myarray=new File[10];
ist dies nicht erforderlich, da es in der nächsten Zeile überschrieben wird!nette Verwendung von
java.io.FileFilter
wie auf https://stackoverflow.com/a/286001/146745 zu sehenquelle
quelle
Ich denke, dies ist eine gute Möglichkeit, alle Dateien in einem Ordner und Unterordner zu lesen
quelle
Einfaches Beispiel, das mit Java 1.7 funktioniert, um Dateien in Verzeichnissen, die in der Befehlszeile angegeben sind, rekursiv aufzulisten:
quelle
Während ich Rich, Orian und den anderen zustimme, verwenden sie:
Aus irgendeinem Grund verwenden alle Beispiele hier den absoluten Pfad (dh den gesamten Weg von root oder beispielsweise den Laufwerksbuchstaben (C: \) für Windows.)
Ich möchte hinzufügen, dass es möglich ist, auch den relativen Pfad zu verwenden . Wenn Sie also pwd (aktuelles Verzeichnis / Ordner) Ordner1 ist und Ordner1 / Unterordner analysieren möchten, schreiben Sie einfach (im obigen Code anstelle von):
quelle
quelle
Java 8
Files.walk(..)
ist gut, wenn Sie soore sind, dass es keine Java 8 Files.walk (..) -Kündigungsursache von (java.nio.file.AccessDeniedException) auslöst .Hier ist eine sichere Lösung, die jedoch nicht so elegant ist wie Java 8
Files.walk(..)
:quelle
quelle
Um die akzeptierte Antwort zu erweitern, speichere ich die Dateinamen in einer ArrayList (anstatt sie nur in System.out.println abzulegen). Ich habe eine Hilfsklasse "MyFileUtils" erstellt, damit sie von anderen Projekten importiert werden kann:
Ich habe den vollständigen Pfad zum Dateinamen hinzugefügt. Sie würden es so verwenden:
Die ArrayList wird von "value" übergeben, aber der Wert wird verwendet, um auf dasselbe ArrayList-Objekt zu verweisen, das sich im JVM-Heap befindet. Auf diese Weise fügt jeder Rekursionsaufruf Dateinamen zur gleichen ArrayList hinzu (wir erstellen NICHT bei jedem rekursiven Aufruf eine neue ArrayList).
quelle
Sie können den Dateipfad zum Argument setzen und eine Liste mit allen Dateipfaden erstellen und nicht manuell in die Liste einfügen. Verwenden Sie dann eine for-Schleife und einen Reader. Beispiel für txt-Dateien:
quelle
quelle
quelle
quelle
Sie können beliebige Textdateien oder andere Erweiterungen filtern. Ersetzen Sie sie einfach durch .MP3
quelle
Oben gibt es viele gute Antworten. Hier ist ein anderer Ansatz: In einem Maven-Projekt wird alles, was Sie in den Ressourcenordner legen, standardmäßig in den Ordner target / classes kopiert. Um zu sehen, was zur Laufzeit verfügbar ist
Um die Dateien aus einem bestimmten Ordner abzurufen, nehmen wir an, Sie haben einen Ordner mit dem Namen "res" in Ihrem Ressourcenordner. Ersetzen Sie einfach:
Wenn Sie Zugriff auf Ihr com.companyName-Paket haben möchten, gehen Sie wie folgt vor:
quelle
Dadurch werden die angegebenen Dateierweiterungsdateien im angegebenen Pfad gelesen (siehe auch Unterordner).
quelle
files container
?Dies wird gut funktionieren:
quelle
Listet bei einem BaseDir alle Dateien und Verzeichnisse darunter auf, die iterativ geschrieben wurden.
quelle
um Nullpointerexceptions in der Funktion listFiles () zu verhindern und rekursiv auch alle Dateien aus Unterverzeichnissen abzurufen.
quelle