Zgadzam się, wskaż klasę, która ma zostać użyta, aby plakat mógł zapoznać się z różnymi metodami, w przeciwnym razie plakat nie będzie próbował czytać interfejsu API, aby dowiedzieć się, jakie inne metody są dostępne.
camickr
5
Czy chodziło Ci o wszystkie pliki w folderze, czy wszystkie pliki w folderze i wszystkie podfoldery?
getName()poda tylko nazwę pliku w swoim katalogu, który może być podkatalogiem oryginału. Jeśli planujesz użyć tych informacji do znalezienia plików, może okazać się, że ścieżka podana przez getPath()jest bardziej przydatna.
Tim Parenti
4
Czy mogę użyć tej metody, aby znaleźć wszystkie pliki określonego typu, np. Pdf lub HTML w całym systemie? Moje obawy dotyczą wydajności, czy jest wystarczająco szybki, aby można go było stosować w systemach z tysiącami plików, czy jest lepsza alternatywa?
Nitin Labhishetty
@codeln Począwszy od Java 8, wydajność jest bardzo do przyjęcia, nie zauważasz w tym nic opóźnionego. Jest szybki, wydajny i wystarczająco czytelny, aby wykonać zadanie.
tom_mai78101
17
W Javie 8 możesz również skorzystać z tej filtermetody. Zatem forEach nie jest już potrzebny. Zobacz tutaj -> stackoverflow.com/a/26215931/1029251
Musisz także pamiętać o zamknięciu strumienia! W przeciwnym razie możesz napotkać wyjątek informujący, że otwartych jest zbyt wiele plików. Przeczytaj tutaj, aby uzyskać więcej informacji.
Wszystkie odpowiedzi na ten temat, które wykorzystują nowe funkcje Java 8, zaniedbują zamknięcie strumienia. Przykład w zaakceptowanej odpowiedzi powinien brzmieć:
Zwrócony strumień zawiera jeden lub więcej DirectoryStreams. Jeśli wymagane jest terminowe usuwanie zasobów systemu plików, należy zastosować konstrukcję try-with-resources, aby upewnić się, że metoda zamknięcia strumienia zostanie wywołana po zakończeniu operacji strumienia.
Nigdy nie powinieneś iterować ze Streamem. Bierzesz odniesienie do strumienia, korzystasz z niego i przenikasz.
Rudolf Schmidt
@RudolfSchmidt masz na myśli „wyrzucić”?
Roland
1
Mam na myśli, że poprawnym sposobem jest użycie go w ten sposób: 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());}}}}}
Witamy w ! Zamiast pisać tylko blok kodu, wyjaśnij, dlaczego ten kod rozwiązuje postawiony problem. Bez wyjaśnienia nie jest to odpowiedź.
Martijn Pieters
Zgadzam się, tylko opublikowanie bloku kodu nie będzie działać, proszę przynajmniej dodać kilka komentarzy w kodzie ...
Ashraf.Shk786
jest to tak dobry kod, że może odczytywać również pliki z podkatalogów folderu.
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);}
Możesz także utworzyć filtr, który można następnie przekazać do newDirectoryStreampowyższej metody
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;}}};
Jestem zdezorientowany przykładem tworzenia filtra. Co to jest newDirectoryStream.Filter <Ścieżka>. Czy możesz pokazać, jak to jest zadeklarowane?
simgineer,
Myślę, że to rozgryzłem. jego kopia i wklej literówkę. pomiędzy „nowym” a „DirectoryStream.Filter ...” jest spacja. Jeśli mam rację, zalecam poprawienie twojego przykładu.
simgineer,
9
Jedna uwaga zgodnie z wszystkimi plikami w katalogu.
Metoda Files.walk(path)zwróci wszystkie pliki, przechodząc do drzewa plików zakorzenionego w podanym uruchomionym pliku.
Zauważ, że ten kod zgłosi wyjątek (i nie zgłasza dalszych plików), jeśli dla niektórych plików lub katalogów atrybuty plików nie mogły zostać odczytane, np. Z powodu uprawnień. Łatwe do odtworzenia na `C:`.
Thomas S.,
5
Jeśli chcesz uzyskać więcej opcji, możesz użyć tej funkcji, która ma na celu zapełnienie listy plików znajdujących się w folderze. Dostępne opcje: rekurencyjność i wzór do dopasowania.
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;}
Możesz dodać wyjaśnienie, co próbujesz osiągnąć, zamiast pokazywać tylko kod. Co więcej, myarray=new File[10];nie jest wymagane, ponieważ zostanie zastąpione przez następny wiersz!
Chociaż zgadzam się z Richiem, Orianem i resztą za użycie:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
z jakiegoś powodu wszystkie przykłady tutaj wykorzystują ścieżkę bezwzględną (tj. całą drogę od roota lub, powiedzmy, literę dysku (C: \) dla Windows ..)
Chciałbym dodać, że można również użyć ścieżki względnej . Więc jeśli jesteś pwd (bieżący katalog / folder) to folder1 i chcesz przeanalizować folder1 / podfolder, po prostu napisz (w powyższym kodzie zamiast):
Aby rozwinąć zaakceptowaną odpowiedź, przechowuję nazwy plików w ArrayList (zamiast po prostu zrzucić je do System.out.println) utworzyłem klasę pomocniczą „MyFileUtils”, aby mogła zostać zaimportowana przez inne projekty:
ArrayList jest przekazywany przez „wartość”, ale wartość jest używana do wskazywania tego samego obiektu ArrayList, który mieszka w stercie JVM. W ten sposób każde wywołanie rekurencyjne dodaje nazwy plików do tej samej ArrayList (NIE tworzymy nowej ArrayList dla każdego wywołania rekurencyjnego).
Możesz podać ścieżkę pliku do argumentu i utworzyć listę ze wszystkimi ścieżkami do plików, a nie umieszczać jej ręcznie. Następnie użyj pętli for i czytnika. Przykład dla plików txt:
wyświetl listę plików z folderu Test znajdujących się wewnątrz ścieżki klasy
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"));}}
Możesz filtrować dowolne pliki tekstowe lub inne rozszerzenia. Po prostu zamień je na .MP3
Istnieje wiele dobrych odpowiedzi powyżej, oto inne podejście: w projekcie maven wszystko, co umieścisz w folderze zasobów, jest domyślnie kopiowane do folderu docelowego / klas. Aby zobaczyć, co jest dostępne w czasie wykonywania
Przepraszam, jeśli to pytanie noob, ale co powinienem przekazać jako files container?
Pramesh Bajracharya
0
To zadziała dobrze:
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
, zobacz stackoverflow.com/a/23814217/1115554Odpowiedzi:
Pliki API Files.walk są dostępne w Javie 8.
W przykładzie użyto wzorca try-with-resources zalecanego w przewodniku API. Zapewnia to, że bez względu na okoliczności strumień zostanie zamknięty.
źródło
getName()
poda tylko nazwę pliku w swoim katalogu, który może być podkatalogiem oryginału. Jeśli planujesz użyć tych informacji do znalezienia plików, może okazać się, że ścieżka podana przezgetPath()
jest bardziej przydatna.filter
metody. Zatem forEach nie jest już potrzebny. Zobacz tutaj -> stackoverflow.com/a/26215931/1029251źródło
W Javie 8 możesz to zrobić
który wydrukuje wszystkie pliki w folderze, wyłączając jednocześnie wszystkie katalogi. Jeśli potrzebujesz listy, wykonaj następujące czynności:
Jeśli chcesz wrócić
List<File>
zamiast poList<Path>
prostu zmapować:Musisz także pamiętać o zamknięciu strumienia! W przeciwnym razie możesz napotkać wyjątek informujący, że otwartych jest zbyt wiele plików. Przeczytaj tutaj, aby uzyskać więcej informacji.
źródło
java.nio.file.Path
? Właśnie sprawdziłem, że metoda toFile () powinna istnieć jeszcze przed java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…Wszystkie odpowiedzi na ten temat, które wykorzystują nowe funkcje Java 8, zaniedbują zamknięcie strumienia. Przykład w zaakceptowanej odpowiedzi powinien brzmieć:
Z javadoc
Files.walk
metody:źródło
źródło
źródło
W Javie 7 i nowszych możesz użyć listdir
Możesz także utworzyć filtr, który można następnie przekazać do
newDirectoryStream
powyższej metodyW celu uzyskania innych przykładów filtrowania [patrz dokumentacja]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
źródło
Jedna uwaga zgodnie z wszystkimi plikami w katalogu.
Metoda
Files.walk(path)
zwróci wszystkie pliki, przechodząc do drzewa plików zakorzenionego w podanym uruchomionym pliku.Na przykład istnieje następne drzewo plików:
Korzystanie z
java.nio.file.Files.walk(Path)
:Daje następujący wynik:
Aby uzyskać wszystkie pliki tylko w bieżącym katalogu, użyj
java.nio.file.Files.list(Path)
:Wynik:
źródło
Files.list
przykładem. Jeśli nie chcesz wyszukiwać rekurencyjnie, czasami może to być najlepsza opcja.Po prostu przejdź przez wszystkie pliki za pomocą
Files.walkFileTree
(Java 7)źródło
Jeśli chcesz uzyskać więcej opcji, możesz użyć tej funkcji, która ma na celu zapełnienie listy plików znajdujących się w folderze. Dostępne opcje: rekurencyjność i wzór do dopasowania.
Pozdrawiam, Adrien
źródło
źródło
myarray=new File[10];
nie jest wymagane, ponieważ zostanie zastąpione przez następny wiersz!ładne wykorzystanie
java.io.FileFilter
jak widać na https://stackoverflow.com/a/286001/146745źródło
źródło
Myślę, że to dobry sposób na odczyt wszystkich plików w folderze i podfolderze
źródło
Prosty przykład, który współpracuje z Javą 1.7 w celu rekurencyjnego wyświetlania plików w katalogach określonych w wierszu poleceń:
źródło
Chociaż zgadzam się z Richiem, Orianem i resztą za użycie:
z jakiegoś powodu wszystkie przykłady tutaj wykorzystują ścieżkę bezwzględną (tj. całą drogę od roota lub, powiedzmy, literę dysku (C: \) dla Windows ..)
Chciałbym dodać, że można również użyć ścieżki względnej . Więc jeśli jesteś pwd (bieżący katalog / folder) to folder1 i chcesz przeanalizować folder1 / podfolder, po prostu napisz (w powyższym kodzie zamiast):
źródło
źródło
Java 8
Files.walk(..)
jest dobra, gdy jesteś w trakcie gry, nie wyrzuci przyczyny przerwania Java 8 Files.walk (..) (wyjątek java.nio.file.AccessDeniedException) .Oto bezpieczne rozwiązanie, choć nie tak eleganckie jak Java 8
Files.walk(..)
:źródło
źródło
Aby rozwinąć zaakceptowaną odpowiedź, przechowuję nazwy plików w ArrayList (zamiast po prostu zrzucić je do System.out.println) utworzyłem klasę pomocniczą „MyFileUtils”, aby mogła zostać zaimportowana przez inne projekty:
Dodałem pełną ścieżkę do nazwy pliku. Użyłbyś tego w ten sposób:
ArrayList jest przekazywany przez „wartość”, ale wartość jest używana do wskazywania tego samego obiektu ArrayList, który mieszka w stercie JVM. W ten sposób każde wywołanie rekurencyjne dodaje nazwy plików do tej samej ArrayList (NIE tworzymy nowej ArrayList dla każdego wywołania rekurencyjnego).
źródło
Możesz podać ścieżkę pliku do argumentu i utworzyć listę ze wszystkimi ścieżkami do plików, a nie umieszczać jej ręcznie. Następnie użyj pętli for i czytnika. Przykład dla plików txt:
źródło
źródło
źródło
źródło
Możesz filtrować dowolne pliki tekstowe lub inne rozszerzenia. Po prostu zamień je na .MP3
źródło
Istnieje wiele dobrych odpowiedzi powyżej, oto inne podejście: w projekcie maven wszystko, co umieścisz w folderze zasobów, jest domyślnie kopiowane do folderu docelowego / klas. Aby zobaczyć, co jest dostępne w czasie wykonywania
Teraz, aby pobrać pliki z określonego folderu, powiedzmy, że masz folder o nazwie „res” w folderze zasobów, po prostu zastąp:
Jeśli chcesz mieć dostęp do pakietu com.companyName:
źródło
Spowoduje to odczytanie określonych plików rozszerzeń plików w danej ścieżce (wygląda również na podfoldery)
źródło
files container
?To zadziała dobrze:
źródło
Biorąc pod uwagę baseDir, wymienia wszystkie pliki i katalogi poniżej, zapisane iteracyjnie.
źródło
aby zapobiec wyjątkom Nullpointerexcept dla funkcji listFiles () i rekurencyjnie pobrać wszystkie pliki z podkatalogów ..
źródło