Bagaimana cara membaca semua file dalam folder dari Java?


669

Bagaimana cara membaca semua file dalam folder melalui Java?


8
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?
Jim Garrison


2
Jika Anda menggunakan Java 7 atau lebih baru yang dapat Anda gunakan Files.walkFileTree, lihat stackoverflow.com/a/23814217/1115554
micha

Jawaban:


977
public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(fileEntry.getName());
        }
    }
}

final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);

API Files.walk tersedia dari Java 8.

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
    paths
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
} 

Contoh ini menggunakan pola coba-dengan-sumber daya yang direkomendasikan dalam panduan API. Ini memastikan bahwa tidak peduli keadaan apa pun aliran akan ditutup.


10
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.
kaya

176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

2
Saya pikir ini akan mencetak nama-nama direktori, dan tidak ada nama file
Fortega

1
Jauh lebih mudah dipahami daripada jawaban yang diterima. +1.
sam1370

129

Di Java 8 Anda bisa melakukan ini

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .forEach(System.out::println);

yang akan mencetak semua file dalam folder sambil mengecualikan semua direktori. Jika Anda memerlukan daftar, hal-hal berikut akan dilakukan:

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .collect(Collectors.toList())

Jika Anda ingin kembali, List<File>bukan List<Path>hanya memetakannya:

List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
                                .filter(Files::isRegularFile)
                                .map(Path::toFile)
                                .collect(Collectors.toList());

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.


3
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/…
Julian Pieles

2
@NadjibMami Silakan lihat di sini: razem.io/blog/posts/year2015/0819_try_catch_lambda Harus dikompilasi untuk menjawab dalam komentar. Jadi saya menulis posting blog cepat.
Julian Pieles

2
Jika ada yang masih mencari topik coba tangkap lambda, url blog saya telah diubah -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles

26

Semua jawaban pada topik ini yang menggunakan fungsi Java 8 yang baru diabaikan untuk menutup aliran. Contoh dalam jawaban yang diterima harus:

try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
    filePathStream.forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
            System.out.println(filePath);
        }
    });
}

Dari javadoc Files.walkmetode:

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;


public class ReadFilesFromFolder {
  public static File folder = new File("C:/Documents and Settings/My Documents/Downloads");
  static String temp = "";

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Reading files under the folder "+ folder.getAbsolutePath());
    listFilesForFolder(folder);
  }

  public static void listFilesForFolder(final File folder) {

    for (final File 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());
        }

      }
    }
  }
}

6
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
private static final String ROOT_FILE_PATH="/";
File f=new File(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 = new DirectoryStream.Filter<Path>() {
    public boolean accept(Path file) throws IOException {
        try {
            return (Files.isRegularFile(path));
        } catch (IOException x) {
            // Failed to determine if it's a file.
            System.err.println(x);
            return false;
        }
    }
};

Untuk contoh penyaringan lainnya, [lihat dokumentasi]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )


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.

Misalnya, ada bagan file berikutnya:

\---folder
    |   file1.txt
    |   file2.txt
    |
    \---subfolder
            file3.txt
            file4.txt

Menggunakan java.nio.file.Files.walk(Path):

Files.walk(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Memberikan hasil sebagai berikut:

folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt

Untuk mendapatkan semua file hanya di direktori saat ini, gunakan java.nio.file.Files.list(Path):

Files.list(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Hasil:

folder\file1.txt
folder\file2.txt

Ini seharusnya menjadi satu-satunya jawaban yang tersisa untuk pertanyaan sekarang pada tahun 2020 :)
Haramoz

Suara positif untuk Files.listcontoh. Jika Anda tidak ingin mencari secara rekursif, ini bisa menjadi pilihan terbaik kadang-kadang.
Per Lundberg

7

Cukup telusuri semua File menggunakan Files.walkFileTree(Java 7)

Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("file: " + file);
        return FileVisitResult.CONTINUE;
    }
});

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.

public static ArrayList<File> listFilesForFolder(final File folder,
        final boolean recursivity,
        final String patternFileFilter) {

    // Inputs
    boolean filteredFile = false;

    // Ouput
    final ArrayList<File> output = new ArrayList<File> ();

    // Foreach elements
    for (final File fileEntry : folder.listFiles()) {

        // If this element is a directory, do it recursivly
        if (fileEntry.isDirectory()) {
            if (recursivity) {
                output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));
            }
        }
        else {
            // If there is no pattern, the file is correct
            if (patternFileFilter.length() == 0) {
                filteredFile = true;
            }
            // Otherwise we need to filter by pattern
            else {
                filteredFile = Pattern.matches(patternFileFilter, fileEntry.getName());
            }

            // If the file has a name which match with the pattern, then add it to the list
            if (filteredFile) {
                output.add(fileEntry);
            }
        }
    }

    return output;
}

Terbaik, Adrien


4
File directory = new File("/user/folder");      
File[] myarray;  
myarray=new File[10];
myarray=directory.listFiles();
for (int j = 0; j < myarray.length; j++)
{
       File path=myarray[j];
       FileReader fr = new FileReader(path);
       BufferedReader br = new BufferedReader(fr);
       String s = "";
       while (br.ready()) {
          s += br.readLine() + "\n";
       }
}

1
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!
Veger


3
    static File mainFolder = new File("Folder");
    public static void main(String[] args) {

        lf.getFiles(lf.mainFolder);
    }
    public void 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]);
            }
        }
    }

3

Saya pikir ini adalah cara yang baik untuk membaca semua file dalam folder dan sub folder

private static void addfiles (File input,ArrayList<File> files)
{
    if(input.isDirectory())
    {
        ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.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));
            }
        }
    }
    if(input.isFile())
    {
        files.add(input);
    }
}

3

Contoh sederhana yang berfungsi dengan Java 1.7 untuk mendaftarkan file secara rekursif dalam direktori yang ditentukan pada command-line:

import java.io.File;

public class List {
    public static void main(String[] args) {
        for (String f : args) {
            listDir(f);
        }
    }

    private static void listDir(String dir) {
        File f = new File(dir);
        File[] list = f.listFiles();

        if (list == null) {
            return;
        }

        for (File entry : list) {
            System.out.println(entry.getName());
            if (entry.isDirectory()) {
                listDir(entry.getAbsolutePath());
            }
        }
    }
}

3

Sementara saya setuju dengan Rich, Orian dan yang lainnya untuk menggunakan:

    final File keysFileFolder = new File(<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):

    final File keysFileFolder = new File("subfolder");

2
package com;


import java.io.File;

/**
 *
 * @author ?Mukesh
 */
public class ListFiles {

     static File mainFolder = new File("D:\\Movies");

     public static void main(String[] args)
     {
         ListFiles lf = new ListFiles();
         lf.getFiles(lf.mainFolder);

         long fileSize = mainFolder.length();
             System.out.println("mainFolder size in bytes is: " + fileSize);
             System.out.println("File size in KB is : " + (double)fileSize/1024);
             System.out.println("File size in MB is :" + (double)fileSize/(1024*1024));
     }
     public void getFiles(File f){
         File files[];
         if(f.isFile())
             System.out.println(f.getAbsolutePath());
         else{
             files = f.listFiles();
             for (int i = 0; i < files.length; i++) {
                 getFiles(files[i]);
             }
         }
     }
}

2

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(..):

int[] count = {0};
try {
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);

                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                     System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

1
void getFiles(){
        String dirPath = "E:/folder_name";
        File dir = new File(dirPath);
        String[] files = dir.list();
        if (files.length == 0) {
            System.out.println("The directory is empty");
        } else {
            for (String aFile : files) {
                System.out.println(aFile);
            }
        }
    }

1

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:

class MyFileUtils {
    public static void loadFilesForFolder(final File folder, List<String> fileList){
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                loadFilesForFolder(fileEntry, fileList);
            } else {
                fileList.add( fileEntry.getParent() + File.separator + fileEntry.getName() );
            }
        }
    }
}

Saya menambahkan path lengkap ke nama file. Anda akan menggunakannya seperti ini:

import MyFileUtils;

List<String> fileList = new ArrayList<String>();
final File folder = new File("/home/you/Desktop");
MyFileUtils.loadFilesForFolder(folder, fileList);

// Dump file list values
for (String fileName : fileList){
    System.out.println(fileName);
}

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).


1

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:

public static void main(String[] args) throws IOException{    
File[] files = new File(args[0].replace("\\", "\\\\")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
    ArrayList<String> filedir = new ArrayList<String>();
    String FILE_TEST = null;
    for (i=0; i<files.length; i++){
            filedir.add(files[i].toString());
            CSV_FILE_TEST=filedir.get(i) 

        try(Reader testreader = Files.newBufferedReader(Paths.get(FILE_TEST));
            ){
              //write your stuff
                 }}}

1
package com.commandline.folder;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FolderReadingDemo {
    public static void main(String[] args) {
        String str = args[0];
        final File folder = new File(str);
//      listFilesForFolder(folder);
        listFilesForFolder(str);
    }

    public static void listFilesForFolder(String str) {
        try (Stream<Path> paths = Files.walk(Paths.get(str))) {
            paths.filter(Files::isRegularFile).forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void listFilesForFolder(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                System.out.println(fileEntry.getName());
            }
        }
    }

}

0
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class AvoidNullExp {

public static void main(String[] args) {

    List<File> fileList =new ArrayList<>();
     final File folder = new File("g:/master");
     new AvoidNullExp().listFilesForFolder(folder, fileList);
}

    public void listFilesForFolder(final File folder,List<File> fileList) {
        File[] filesInFolder = folder.listFiles();
        if (filesInFolder != null) {
            for (final File fileEntry : filesInFolder) {
                if (fileEntry.isDirectory()) {
                    System.out.println("DIR : "+fileEntry.getName());
                listFilesForFolder(fileEntry,fileList);
            } else {
                System.out.println("FILE : "+fileEntry.getName());
                fileList.add(fileEntry);
            }
         }
        }
     }


}

0

daftar file dari folder Test yang ada di dalam jalur kelas

import java.io.File;
import java.io.IOException;

public class Hello {

    public static void main(final String[] args) throws IOException {

        System.out.println("List down all the files present on the server directory");
        File file1 = new File("/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()));
                }
            }
        }


    }


}

0
/**
 * Function to read all mp3 files from sdcard and store the details in an
 * ArrayList
 */


public ArrayList<HashMap<String, String>> getPlayList() 
    {
        ArrayList<HashMap<String, String>> songsList=new ArrayList<>();
        File home = new File(MEDIA_PATH);

        if (home.listFiles(new FileExtensionFilter()).length > 0) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<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 array
        return songsList;
    }

    /**
     * Class to filter files which have a .mp3 extension
     * */
    class FileExtensionFilter implements FilenameFilter 
    {
        @Override
        public boolean 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


0

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

 ClassLoader contextClassLoader = 
 Thread.currentThread().getContextClassLoader();
    URL resource = contextClassLoader.getResource("");
    File file = new File(resource.toURI());
    File[] files = file.listFiles();
    for (File f : files) {
        System.out.println(f.getName());
    }

Sekarang untuk mendapatkan file dari folder tertentu, katakanlah Anda memiliki folder bernama 'res' di folder sumber daya Anda, cukup ganti:

URL resource = contextClassLoader.getResource("res");

Jika Anda ingin memiliki akses dalam paket com.companyName Anda, maka:

contextClassLoader.getResource("com.companyName");

0

Ini akan Baca file ekstensi file yang Ditentukan di jalur yang diberikan (terlihat sub folder juga)

public static Map<String,List<File>> getFileNames(String 
dirName,Map<String,List<File>> filesContainer,final String fileExt){
    String dirPath = dirName;
    List<File>files = new ArrayList<>();
    Map<String,List<File>> completeFiles = filesContainer; 
    if(completeFiles == null) {
        completeFiles = new HashMap<>();
    }
    File file = new File(dirName);

    FileFilter fileFilter = new FileFilter() {
        @Override
        public boolean accept(File file) {
            boolean acceptFile = false;
            if(file.isDirectory()) {
                acceptFile = true;
            }else if (file.getName().toLowerCase().endsWith(fileExt))
              {
                acceptFile = true;
              }
            return acceptFile;
        }
    };
    for(File dirfile : file.listFiles(fileFilter)) {
        if(dirfile.isFile() && 
dirfile.getName().toLowerCase().endsWith(fileExt)) {
            files.add(dirfile);
        }else if(dirfile.isDirectory()) {
            if(!files.isEmpty()) {
                completeFiles.put(dirPath, files);  
            }

getFileNames(dirfile.getAbsolutePath(),completeFiles,fileExt);
        }
    }
    if(!files.isEmpty()) {
        completeFiles.put(dirPath, files);  
    }
    return completeFiles;
}

Maaf jika ini pertanyaan noob tapi apa yang harus saya sampaikan sebagai files container?
Pramesh Bajracharya

0

Ini akan bekerja dengan baik:

private static void addfiles(File inputValVal, ArrayList<File> files)
{
  if(inputVal.isDirectory())
  {
    ArrayList <File> path = new ArrayList<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);
   }

}

0

Diberikan baseDir, daftar semua file dan direktori di bawahnya, ditulis secara iteratif.

    public static List<File> listLocalFilesAndDirsAllLevels(File baseDir) {

    List<File>  collectedFilesAndDirs   = new ArrayList<>();
    Deque<File> remainingDirs           = new ArrayDeque<>();

    if(baseDir.exists()) {
        remainingDirs.add(baseDir);

        while(!remainingDirs.isEmpty()) {
            File dir = remainingDirs.removeLast();
            List<File> filesInDir = Arrays.asList(dir.listFiles());
            for(File fileOrDir : filesInDir)  {
                collectedFilesAndDirs.add(fileOrDir);
                if(fileOrDir.isDirectory()) {
                    remainingDirs.add(fileOrDir);
                }
            }
        }
    }

    return collectedFilesAndDirs;
}

-1

untuk mencegah Nullpointerexceptions pada fungsi listFiles () dan secara berulang mendapatkan semua file dari subdirektori juga ..

 public void listFilesForFolder(final File folder,List<File> fileList) {
    File[] filesInFolder = folder.listFiles();
    if (filesInFolder != null) {
        for (final File fileEntry : filesInFolder) {
            if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry,fileList);
        } else {
            fileList.add(fileEntry);
        }
     }
    }
 }

 List<File> fileList = new List<File>();
 final File folder = new File("/home/you/Desktop");
 listFilesForFolder(folder);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.