Bagaimana cara membaca semua file dalam folder dari Java?

669

Bagaimana cara membaca semua file dalam folder melalui Java?

MJ
sumber
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
3
Tautan terkini ke API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Tom Duckering
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.

kaya
sumber
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());
    }
}
David Robles
sumber
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.

Julian Pieles
sumber
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.

Martin
sumber
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());
        }

      }
    }
  }
}
muthu krishna
sumber
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
    }
}
Sanket Thakkar
sumber
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 )

Mark Spangler
sumber
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
xxx konsep
sumber
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;
    }
});
micha
sumber
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

Adrien Hadj-Salah
sumber
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";
       }
}
sailakshmi Duggirala
sumber
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

penggunaan bagus java.io.FileFilterseperti yang terlihat di https://stackoverflow.com/a/286001/146745

File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {          
    public boolean accept(File file) {
        return file.isFile();
    }
});
andrej
sumber
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
    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]);
            }
        }
    }
Santosh Rathod
sumber
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);
    }
}
Mohammad
sumber
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());
            }
        }
    }
}
pdp
sumber
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");
JamesC
sumber
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]);
             }
         }
     }
}
Mukesh Jha
sumber
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();
}
GOXR3PLUS
sumber
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);
            }
        }
    }
Subhojit Das
sumber
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).

Salvador Valencia
sumber
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
                 }}}
Aris Mist
sumber
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());
            }
        }
    }

}
Manas Ranjan Mahapatra
sumber
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);
            }
         }
        }
     }


}
ChetanTwr
sumber
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()));
                }
            }
        }


    }


}
shree
sumber
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

Zar E Ahmer
sumber
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");
moldovean
sumber
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;
}
Katta Nagarjuna
sumber
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);
   }

}
Ashraf.Shk786
sumber
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;
}
WillDev10
sumber
-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);
Muenchnair
sumber