Saya setuju, tunjukkan kelas yang akan digunakan agar poster dapat mengenal berbagai metode, jika tidak, poster tidak perlu membaca API untuk mengetahui metode apa yang tersedia.
camickr
5
Apakah maksud Anda semua file dalam folder, atau semua file dalam folder dan semua subfolder?
Contoh ini menggunakan pola coba-dengan-sumber daya yang direkomendasikan dalam panduan API. Ini memastikan bahwa tidak peduli keadaan apa pun aliran akan ditutup.
getName()hanya akan memberikan nama file dalam direktori, yang bisa menjadi subdirektori dari aslinya. Jika Anda berencana untuk menggunakan informasi ini untuk menemukan file, Anda mungkin menemukan jalur yang diberikan oleh getPath()untuk menjadi lebih bermanfaat.
Tim Parenti
4
Bisakah saya menggunakan metode ini untuk menemukan semua file dari tipe tertentu katakanlah pdf atau html di seluruh sistem saya? Kekhawatiran saya adalah efisiensi, apakah cukup cepat untuk digunakan untuk sistem dengan ribuan file atau apakah ada alternatif yang lebih baik?
Nitin Labhishetty
@codeln Pada Java 8, kinerjanya sangat dapat diterima, Anda tidak melihat ada yang lamban tentang itu. Ini cepat, efisien, dan cukup mudah dibaca untuk menyelesaikan pekerjaan Anda.
tom_mai78101
17
Di Java 8 Anda juga dapat menggunakan filtermetode ini. Maka forEach tidak lagi dibutuhkan. Lihat di sini -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Hanya untuk menunjukkan itu hanya diinisialisasi sekali.
Anda juga perlu memastikan untuk menutup aliran! Kalau tidak, Anda mungkin mengalami pengecualian yang memberi tahu Anda bahwa terlalu banyak file yang terbuka. Baca di sini untuk informasi lebih lanjut.
Mendapatkan kesalahan dengan .map (Path :: toFile) Juga .forEach (path -> System.out.println (path.toString ()); harus .forEach (path -> System.out.println (path.toString ( )));
XaolingBao
2
Ia mengatakan "Referensi metode tidak valid, tidak dapat menemukan simbol" "Metode toFile" apakah toFile seharusnya menjadi sesuatu yang lain?
XaolingBao
2
Bisakah Anda menempelkan kode Anda di PasteBin? Apakah Anda menggunakan java.nio.file.Path? Saya baru saja memeriksa metode toFile () harus ada bahkan sebelum java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Aliran yang dikembalikan merangkum satu atau lebih DirectoryStreams. Jika pembuangan tepat waktu dari sumber daya sistem file diperlukan, konstruk coba-dengan-sumber daya harus digunakan untuk memastikan bahwa metode penutupan aliran dipanggil setelah operasi aliran selesai.
Anda seharusnya tidak pernah beralih dengan Stream. Anda mengambil referensi Stream, menggunakannya dan melewatinya.
Rudolf Schmidt
@RudolfSchmidt maksudmu "membuangnya"?
Roland
1
Maksud saya cara yang benar adalah menggunakannya dengan cara itu: 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());}}}}}
Selamat Datang di ! Daripada hanya memposting blok kode, tolong jelaskan mengapa kode ini menyelesaikan masalah yang ditimbulkan. Tanpa penjelasan, ini bukan jawaban.
Martijn Pieters
Setuju, Hanya memposting blok kode tidak akan berhasil
setidaknya
ini adalah kode yang baik, dapat membaca juga file dalam subdirektori folder.
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}}
Ini adalah solusi untuk android membaca semua file dan folder dari sdcard atau penyimpanan internal.
Sanket Thakkar
10
Di Java 7 dan lebih tinggi Anda bisa menggunakan listdir
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);}
Anda juga dapat membuat filter yang kemudian dapat diteruskan ke newDirectoryStreammetode di atas
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;}}};
Saya bingung dengan contoh filter buat. Apa itu newDirectoryStream.Filter <Path>. Bisakah Anda menunjukkan bagaimana itu dinyatakan?
pemain simgineer
Saya pikir saya sudah menemukannya. ini adalah salin dan tempel salah ketik. ada ruang antara "baru" dan "DirectoryStream.Filter ...". Jika saya benar merekomendasikan untuk memperbaiki contoh Anda.
pemain simgineer
9
Satu komentar sesuai untuk mendapatkan semua file di direktori.
Metode ini Files.walk(path)akan mengembalikan semua file dengan berjalan di pohon file yang di-root pada file awal yang diberikan.
Perhatikan, bahwa kode ini akan mengeluarkan pengecualian (dan tidak melaporkan file lebih lanjut) jika untuk beberapa file atau direktori atribut file tidak dapat dibaca, misalnya karena izin. Mudah direproduksi di `C:`.
Thomas S.
5
Jika Anda ingin lebih banyak opsi, Anda dapat menggunakan fungsi ini yang bertujuan untuk mengisi daftar array file yang ada dalam folder. Pilihannya adalah: kesesuaian dan pola yang cocok.
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;}
Anda mungkin ingin menambahkan penjelasan apa yang ingin Anda capai, alih-alih hanya menunjukkan kode. Selanjutnya, myarray=new File[10];tidak diperlukan, karena akan ditimpa oleh baris berikutnya!
docs.oracle.com/javase/7/docs/api/java/io/... file publik [] listFiles () Mengembalikan array nama path abstrak yang menunjukkan file dalam direktori yang ditandai oleh pathname abstrak ini.
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]);}}}
Sementara saya setuju dengan Rich, Orian dan yang lainnya untuk menggunakan:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
untuk beberapa alasan semua contoh di sini menggunakan path absolut (yaitu semua jalan dari root, atau, katakanlah, huruf drive (C: \) untuk windows ..)
Saya ingin menambahkan bahwa mungkin untuk menggunakan jalur relatif juga. Jadi, jika Anda pwd (direktori / folder saat ini) adalah folder1 dan Anda ingin mem-parsing folder1 / subfolder, Anda cukup menulis (dalam kode di atas alih-alih):
Hanya untuk memperluas jawaban yang diterima saya menyimpan nama file ke ArrayList (bukan hanya membuangnya ke System.out.println) Saya membuat kelas pembantu "MyFileUtils" sehingga dapat diimpor oleh proyek lain:
ArrayList dilewatkan oleh "nilai", tetapi nilainya digunakan untuk menunjuk ke objek ArrayList yang sama yang hidup di JVM Heap. Dengan cara ini, setiap panggilan rekursi menambahkan nama file ke ArrayList yang sama (kami TIDAK membuat ArrayList baru pada setiap panggilan rekursif).
Anda dapat menempatkan path file ke argumen dan membuat daftar dengan semua filepath dan tidak meletakkannya secara manual. Kemudian gunakan for for dan pembaca. Contoh untuk file txt:
daftar file dari folder Test yang ada di dalam jalur kelas
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"));}}
Anda dapat memfilter file teks apa saja atau ekstensi lain .. hanya menggantinya dengan .MP3
Ada banyak jawaban bagus di atas, inilah pendekatan yang berbeda: Dalam proyek pakar, semua yang Anda masukkan ke folder sumber disalin secara default di folder target / kelas. Untuk melihat apa yang tersedia saat runtime
Maaf jika ini pertanyaan noob tapi apa yang harus saya sampaikan sebagai files container?
Pramesh Bajracharya
0
Ini akan bekerja dengan baik:
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
, lihat stackoverflow.com/a/23814217/1115554Jawaban:
API Files.walk tersedia dari Java 8.
Contoh ini menggunakan pola coba-dengan-sumber daya yang direkomendasikan dalam panduan API. Ini memastikan bahwa tidak peduli keadaan apa pun aliran akan ditutup.
sumber
getName()
hanya akan memberikan nama file dalam direktori, yang bisa menjadi subdirektori dari aslinya. Jika Anda berencana untuk menggunakan informasi ini untuk menemukan file, Anda mungkin menemukan jalur yang diberikan olehgetPath()
untuk menjadi lebih bermanfaat.filter
metode ini. Maka forEach tidak lagi dibutuhkan. Lihat di sini -> stackoverflow.com/a/26215931/1029251sumber
Di Java 8 Anda bisa melakukan ini
yang akan mencetak semua file dalam folder sambil mengecualikan semua direktori. Jika Anda memerlukan daftar, hal-hal berikut akan dilakukan:
Jika Anda ingin kembali,
List<File>
bukanList<Path>
hanya memetakannya:Anda juga perlu memastikan untuk menutup aliran! Kalau tidak, Anda mungkin mengalami pengecualian yang memberi tahu Anda bahwa terlalu banyak file yang terbuka. Baca di sini untuk informasi lebih lanjut.
sumber
java.nio.file.Path
? Saya baru saja memeriksa metode toFile () harus ada bahkan sebelum java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…Semua jawaban pada topik ini yang menggunakan fungsi Java 8 yang baru diabaikan untuk menutup aliran. Contoh dalam jawaban yang diterima harus:
Dari javadoc
Files.walk
metode:sumber
sumber
sumber
Di Java 7 dan lebih tinggi Anda bisa menggunakan listdir
Anda juga dapat membuat filter yang kemudian dapat diteruskan ke
newDirectoryStream
metode di atasUntuk contoh penyaringan lainnya, [lihat dokumentasi]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
sumber
Satu komentar sesuai untuk mendapatkan semua file di direktori.
Metode ini
Files.walk(path)
akan mengembalikan semua file dengan berjalan di pohon file yang di-root pada file awal yang diberikan.Misalnya, ada bagan file berikutnya:
Menggunakan
java.nio.file.Files.walk(Path)
:Memberikan hasil sebagai berikut:
Untuk mendapatkan semua file hanya di direktori saat ini, gunakan
java.nio.file.Files.list(Path)
:Hasil:
sumber
Files.list
contoh. Jika Anda tidak ingin mencari secara rekursif, ini bisa menjadi pilihan terbaik kadang-kadang.Cukup telusuri semua File menggunakan
Files.walkFileTree
(Java 7)sumber
Jika Anda ingin lebih banyak opsi, Anda dapat menggunakan fungsi ini yang bertujuan untuk mengisi daftar array file yang ada dalam folder. Pilihannya adalah: kesesuaian dan pola yang cocok.
Terbaik, Adrien
sumber
sumber
myarray=new File[10];
tidak diperlukan, karena akan ditimpa oleh baris berikutnya!penggunaan bagus
java.io.FileFilter
seperti yang terlihat di https://stackoverflow.com/a/286001/146745sumber
sumber
Saya pikir ini adalah cara yang baik untuk membaca semua file dalam folder dan sub folder
sumber
Contoh sederhana yang berfungsi dengan Java 1.7 untuk mendaftarkan file secara rekursif dalam direktori yang ditentukan pada command-line:
sumber
Sementara saya setuju dengan Rich, Orian dan yang lainnya untuk menggunakan:
untuk beberapa alasan semua contoh di sini menggunakan path absolut (yaitu semua jalan dari root, atau, katakanlah, huruf drive (C: \) untuk windows ..)
Saya ingin menambahkan bahwa mungkin untuk menggunakan jalur relatif juga. Jadi, jika Anda pwd (direktori / folder saat ini) adalah folder1 dan Anda ingin mem-parsing folder1 / subfolder, Anda cukup menulis (dalam kode di atas alih-alih):
sumber
sumber
Java 8
Files.walk(..)
baik ketika Anda berada di darat, ia tidak akan membuang Menghindari Java 8 Files.walk (..) penyebab penghentian (java.nio.file.AccessDeniedException) .Ini adalah solusi yang aman, meski tidak seanggun Java 8
Files.walk(..)
:sumber
sumber
Hanya untuk memperluas jawaban yang diterima saya menyimpan nama file ke ArrayList (bukan hanya membuangnya ke System.out.println) Saya membuat kelas pembantu "MyFileUtils" sehingga dapat diimpor oleh proyek lain:
Saya menambahkan path lengkap ke nama file. Anda akan menggunakannya seperti ini:
ArrayList dilewatkan oleh "nilai", tetapi nilainya digunakan untuk menunjuk ke objek ArrayList yang sama yang hidup di JVM Heap. Dengan cara ini, setiap panggilan rekursi menambahkan nama file ke ArrayList yang sama (kami TIDAK membuat ArrayList baru pada setiap panggilan rekursif).
sumber
Anda dapat menempatkan path file ke argumen dan membuat daftar dengan semua filepath dan tidak meletakkannya secara manual. Kemudian gunakan for for dan pembaca. Contoh untuk file txt:
sumber
sumber
sumber
sumber
Anda dapat memfilter file teks apa saja atau ekstensi lain .. hanya menggantinya dengan .MP3
sumber
Ada banyak jawaban bagus di atas, inilah pendekatan yang berbeda: Dalam proyek pakar, semua yang Anda masukkan ke folder sumber disalin secara default di folder target / kelas. Untuk melihat apa yang tersedia saat runtime
Sekarang untuk mendapatkan file dari folder tertentu, katakanlah Anda memiliki folder bernama 'res' di folder sumber daya Anda, cukup ganti:
Jika Anda ingin memiliki akses dalam paket com.companyName Anda, maka:
sumber
Ini akan Baca file ekstensi file yang Ditentukan di jalur yang diberikan (terlihat sub folder juga)
sumber
files container
?Ini akan bekerja dengan baik:
sumber
Diberikan baseDir, daftar semua file dan direktori di bawahnya, ditulis secara iteratif.
sumber
untuk mencegah Nullpointerexceptions pada fungsi listFiles () dan secara berulang mendapatkan semua file dari subdirektori juga ..
sumber