Làm thế nào để đọc tất cả các tệp trong một thư mục từ Java?


668

Làm thế nào để đọc tất cả các tệp trong một thư mục thông qua Java?


8
Tôi đồng ý, chỉ ra lớp sử dụng để người đăng có thể làm quen với phương thức khác nhau, nếu không thì người đăng không bận tâm đọc API để tìm hiểu phương pháp nào khác có sẵn.
camickr

5
Ý bạn là tất cả các tệp trong một thư mục, hay tất cả các tệp trong một thư mục và tất cả các thư mục con?
Jim Garrison


1
Nếu bạn đang sử dụng Java 7 hoặc mới hơn bạn có thể sử dụng Files.walkFileTree, hãy xem stackoverflow.com/a/23814217/1115554
micha

Câu trả lời:


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 có sẵn từ Java 8.

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

Ví dụ sử dụng mẫu thử với tài nguyên được đề xuất trong hướng dẫn API. Nó đảm bảo rằng bất kể trường hợp nào, luồng sẽ được đóng lại.


10
getName()sẽ chỉ cung cấp tên của tệp trong thư mục của nó, có thể là thư mục con của bản gốc. Nếu bạn dự định sử dụng thông tin này để tìm các tệp, bạn có thể thấy đường dẫn được cung cấp getPath()sẽ hữu ích hơn.
Tim Parenti

4
Tôi có thể sử dụng phương pháp này để tìm tất cả các tệp thuộc loại cụ thể nói pdf hoặc html trên toàn bộ hệ thống của mình không? Mối quan tâm của tôi là hiệu quả, nó có đủ nhanh để được sử dụng cho các hệ thống có hàng ngàn tệp hoặc có cách nào khác tốt hơn không?
Nitin Labhishetty

@codeln Kể từ Java 8, hiệu suất rất chấp nhận được, bạn không nhận thấy bất cứ điều gì chậm trễ về nó. Nó nhanh, hiệu quả và đủ dễ đọc để hoàn thành công việc của bạn.
tom_mai78101

17
Trong Java 8, bạn cũng có thể sử dụng filterphương thức này. Sau đó, forEach không còn cần thiết nữa. Xem tại đây -> stackoverflow.com/a/26215931/1029251
Julian Piele

3
Chỉ để cho biết nó chỉ được khởi tạo một lần.
giàu

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
Tôi nghĩ rằng điều này sẽ in tên thư mục và không có tên tệp
Fortega

1
Bởi dễ hiểu hơn câu trả lời được chấp nhận. +1.
sam1370

129

Trong Java 8, bạn có thể làm điều này

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

sẽ in tất cả các tệp trong một thư mục trong khi loại trừ tất cả các thư mục. Nếu bạn cần một danh sách, sau đây sẽ làm:

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

Nếu bạn muốn quay lại List<File>thay vì List<Path>chỉ ánh xạ nó:

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

Bạn cũng cần đảm bảo đóng luồng! Nếu không, bạn có thể gặp phải một ngoại lệ cho bạn biết rằng có quá nhiều tệp được mở. Đọc ở đây để biết thêm thông tin.


3
Gặp lỗi với .map (Path :: toFile) Ngoài ra .forEach (path -> System.out.println (path.toString ()); nên là .forEach (path -> System.out.println (path.toString ( )));
Xaolingbao

2
Nó nói "Tham chiếu phương thức không hợp lệ, không thể tìm thấy biểu tượng" "Phương thức toFile" là toFile có phải là một cái gì khác không?
Xaolingbao

2
Bạn có thể vui lòng dán mã của bạn vào PasteBin không? Bạn đang sử dụng java.nio.file.Path? Tôi vừa kiểm tra phương thức toFile () nên tồn tại ngay cả trước java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/ trộm
Julian Piele

2
@NadjibMami Xin hãy xem tại đây: razem.io/blog/posts/year2015/0819_try_catch_lambda Đã được tổng hợp để trả lời trong một nhận xét. Vì vậy, tôi đã viết một bài đăng blog nhanh chóng.
Julian Piele

2
Nếu bất cứ ai vẫn đang tìm kiếm chủ đề thử bắt lambda, url của blog của tôi đã bị thay đổi -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Piele

26

Tất cả các câu trả lời về chủ đề này sử dụng các hàm Java 8 mới đang bỏ qua việc đóng luồng. Ví dụ trong câu trả lời được chấp nhận phải là:

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

Từ javadoc của Files.walkphương thức:

Luồng được trả về sẽ gói gọn một hoặc nhiều DirectoryStreams. Nếu cần xử lý kịp thời các tài nguyên hệ thống tệp, thì nên sử dụng cấu trúc thử với tài nguyên để đảm bảo rằng phương thức đóng của luồng được gọi sau khi các hoạt động luồng được hoàn thành.


Bạn không bao giờ nên lặp lại với Stream. Bạn lấy một tham chiếu Stream, sử dụng nó và thông qua nó.
Rudolf Schmidt

@RudolfSchmidt bạn có nghĩa là "vứt nó đi"?
Roland

1
Ý tôi là cách chính xác là sử dụng nó theo cách đó: 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
Chào mừng bạn đến ! Thay vì chỉ đăng một khối mã, vui lòng giải thích lý do tại sao mã này giải quyết vấn đề được đặt ra. Không có lời giải thích, đây không phải là một câu trả lời.
Martijn Pieters

Đồng ý, Chỉ cần đăng một khối mã sẽ không hoạt động, vui lòng ít nhất thêm một số nhận xét trong mã ...
Ashraf.Shk786

Đây là mã tốt, nó cũng có thể đọc các tệp trong thư mục con của một thư mục.
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
    }
}

Đây là giải pháp cho android đọc tất cả các tệp và thư mục từ sdcard hoặc bộ nhớ trong.
Sanket Thakkar

9

Trong Java 7 bây giờ bạn có thể làm theo cách này - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#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);
}

Bạn cũng có thể tạo một bộ lọc mà sau đó có thể được truyền vào newDirectoryStreamphương thức trên

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;
        }
    }
};

Các ví dụ lọc khác - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob


Tôi bối rối bởi ví dụ tạo bộ lọc. NewDirectoryStream.Filter <Path> là gì. Bạn có thể cho thấy làm thế nào được tuyên bố?
simgineer

Tôi nghĩ rằng tôi đã tìm ra nó. nó là một bản sao và dán lỗi đánh máy. có một khoảng cách giữa "mới" và "DirectoryStream.Filter ...". Nếu tôi đúng khuyên bạn nên sửa ví dụ của bạn.
simgineer

9

Một nhận xét theo để có được tất cả các tập tin trong thư mục.
Phương thức Files.walk(path)này sẽ trả về tất cả các tệp bằng cách đi bộ cây tệp gốc vào tệp đã bắt đầu.

Chẳng hạn, có cây tập tin tiếp theo:

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

Sử dụng java.nio.file.Files.walk(Path):

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

Cho kết quả như sau:

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

Để nhận tất cả các tệp chỉ trong thư mục hiện tại, hãy sử dụng java.nio.file.Files.list(Path):

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

Kết quả:

folder\file1.txt
folder\file2.txt

Đây sẽ là câu trả lời duy nhất còn lại cho câu hỏi ngay bây giờ vào năm 2020 :)
Haramoz

Upvote cho Files.liství dụ. Nếu bạn không muốn tìm kiếm đệ quy, đôi khi đây có thể là lựa chọn tốt nhất.
Per Lundberg

7

Chỉ cần duyệt qua tất cả các tệp bằng cách sử dụng 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;
    }
});

Lưu ý rằng mã này sẽ đưa ra một ngoại lệ (và không báo cáo bất kỳ tệp nào nữa) nếu đối với một số tệp hoặc thư mục, các thuộc tính tệp không thể được đọc, ví dụ: vì quyền. Dễ dàng sao chép trên `C:`.
Thomas S.

5

Nếu bạn muốn có thêm tùy chọn, bạn có thể sử dụng chức năng này nhằm mục đích đưa vào danh sách các tệp có trong một thư mục. Các tùy chọn là: đệ quy và mô hình để phù hợp.

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;
}

Tốt nhất, 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
Bạn có thể muốn thêm một lời giải thích những gì bạn đang cố gắng để đạt được, thay vì chỉ hiển thị mã. Hơn nữa, myarray=new File[10];không bắt buộc, vì nó sẽ bị ghi đè bởi dòng tiếp theo!
Ăn chay

3

sử dụng tốt java.io.FileFilternhư đã thấy trên 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();
    }
});

docs.oracle.com/javase/7/docs/api/java/io/ Khăn công khai tập tin [] listFiles () Trả về một mảng các tên đường dẫn trừu tượng biểu thị các tệp trong thư mục được biểu thị bằng tên đường dẫn trừu tượng này.
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]);
            }
        }
    }

3

Tôi nghĩ rằng đây là cách tốt để đọc tất cả các tệp trong một thư mục và thư mục con

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

Ví dụ đơn giản hoạt động với Java 1.7 để liệt kê đệ quy các tệp trong các thư mục được chỉ định trên dòng lệnh:

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

Mặc dù tôi đồng ý với Rich, Orian và phần còn lại để sử dụng:

    final File keysFileFolder = new File(<path>); 
    File[] fileslist = keysFileFolder.listFiles();

    if(fileslist != null)
    {
        //Do your thing here...
    }

vì một số lý do, tất cả các ví dụ ở đây sử dụng đường dẫn tuyệt đối (nghĩa là tất cả các cách từ root, hoặc, giả sử, ký tự ổ đĩa (C: \) cho các cửa sổ ..)

Tôi muốn thêm rằng có thể sử dụng đường dẫn tương đối là tốt. Vì vậy, nếu pwd của bạn (thư mục / thư mục hiện tại) là thư mục1 và bạn muốn phân tích thư mục1 / thư mục con, bạn chỉ cần viết (trong mã ở trên thay vì):

    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(..)là tốt khi bạn đang sử dụng, nó sẽ không ném Tránh 8 nguyên nhân chấm dứt Files.walk (..) của (java.nio.file.AccessDeniedException) .

Đây là một giải pháp an toàn, mặc dù không thanh lịch như 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

Chỉ để mở rộng câu trả lời được chấp nhận, tôi lưu trữ tên tệp vào một ArrayList (thay vì chỉ bán chúng cho System.out.println) Tôi đã tạo một lớp trợ giúp "MyFileUtils" để nó có thể được nhập bởi các dự án khác:

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

Tôi đã thêm đường dẫn đầy đủ vào tên tập tin. Bạn sẽ sử dụng nó như thế này:

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 được truyền bởi "value", nhưng giá trị được sử dụng để trỏ đến cùng một đối tượng ArrayList sống trong JVM Heap. Theo cách này, mỗi lệnh gọi đệ quy sẽ thêm tên tệp vào cùng một ArrayList (chúng tôi KHÔNG tạo một ArrayList mới trên mỗi lệnh gọi đệ quy).


1

Bạn có thể đặt đường dẫn tệp để lập luận và tạo một danh sách với tất cả các filepath và không đặt nó vào danh sách theo cách thủ công. Sau đó sử dụng một vòng lặp for và một trình đọc. Ví dụ cho các tệp 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

liệt kê các tập tin từ thư mục Test có trong đường dẫn lớp

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"));
        }
    }

Bạn có thể lọc bất kỳ tệp văn bản hoặc bất kỳ tiện ích mở rộng nào khác .. chỉ cần thay thế nó bằng .MP3


0

Có nhiều câu trả lời hay ở trên, đây là một cách tiếp cận khác: Trong một dự án maven, mọi thứ bạn đặt trong thư mục tài nguyên đều được sao chép theo mặc định trong thư mục đích / lớp. Để xem những gì có sẵn trong thời gian chạy

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

Bây giờ để lấy các tệp từ một thư mục cụ thể, giả sử bạn có một thư mục có tên 'res' trong thư mục tài nguyên của mình, chỉ cần thay thế:

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

Nếu bạn muốn có quyền truy cập trong gói com.companyName thì:

contextClassLoader.getResource("com.companyName");

0

Điều này sẽ đọc các tệp mở rộng tệp được chỉ định trong đường dẫn cụ thể (cũng xem các thư mục phụ)

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;
}

Xin lỗi nếu đây là một câu hỏi không nhưng tôi nên vượt qua như files containerthế nào?
Pramesh Bajracharya

0

Điều này sẽ hoạt động tốt:

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

Đưa ra một BaseDir, liệt kê tất cả các tệp và thư mục bên dưới nó, được viết lặp đi lặp lại.

    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

để ngăn chặn Nullpulumexceptions trên hàm listFiles () và nhận lại tất cả các tệp từ thư mục con ..

 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.