如何从Java读取文件夹中的所有文件?

How to read all files in a folder from Java?

提问人:M.J. 提问时间:12/4/2009 最后编辑:JohnKM.J. 更新时间:7/28/2023 访问量:1418431

问:

想改进这篇文章吗?提供此问题的详细答案,包括引文和解释为什么您的答案是正确的。没有足够细节的答案可能会被编辑或删除。

如何通过Java读取文件夹中的所有文件?哪个 API 并不重要。

java 文件 io 目录

评论

10赞 camickr 12/4/2009
我同意,指出要使用的类,以便发帖人可以熟悉各种方法,否则发帖人不会费心阅读 API 来找出其他可用的方法。
6赞 Jim Garrison 12/4/2009
您的意思是文件夹中的所有文件,还是文件夹中的所有文件和所有子文件夹?
3赞 Tom Duckering 4/28/2014
指向 API 的最新链接:docs.oracle.com/javase/7/docs/api/java/io/File.html
2赞 micha 5/23/2014
如果您使用的是 Java 7 或更高版本,则可以使用 ,请参阅 stackoverflow.com/a/23814217/1115554Files.walkFileTree

答:

217赞 David Robles 12/4/2009 #1
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

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

评论

2赞 Fortega 12/4/2009
我认为这将打印目录名称,而不是文件名
1赞 sam1370 7/14/2018
远比公认的答案更容易理解。+1.
2赞 Farid 2/11/2021
@sam1370 由于它不会读取目录中的所有文件,因此它只能直接获取给定目录中的文件。如果给定目录本身包含其他目录,则不会读取其内容
1137赞 rich 12/4/2009 #2
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);

Files.walk API 可从 Java 8 获得。

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

该示例使用 API 指南中推荐的 try-with-resources 模式。它确保无论在何种情况都将关闭。

评论

13赞 Tim Parenti 9/23/2013
getName()将仅提供其目录中的文件名称,该目录可能是原始目录的子目录。如果您计划使用此信息来查找文件,您可能会发现 提供的路径更有用。getPath()
4赞 Nitin Labhishetty 3/10/2014
我可以使用此方法在整个系统中查找特定类型的所有文件,例如pdf或html吗?我关心的是效率,它是否足够快以用于具有数千个文件的系统,或者是否有更好的选择?
0赞 tom_mai78101 4/15/2014
@codeln 从 Java 8 开始,性能是可以接受的,你不会注意到它有任何滞后之处。它快速、高效且可读性强,足以完成您的工作。
22赞 Julian Pieles 10/6/2014
在 Java 8 中,您还可以使用该方法。那么就不再需要 forEach 了。请参阅此处 -> stackoverflow.com/a/26215931/1029251filter
3赞 rich 12/7/2014
只是为了表明它只初始化了一次。
4赞 sailakshmi Duggirala 4/12/2011 #3
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赞 Veger 2/20/2012
您可能希望添加一个解释,而不是仅显示代码。此外,不是必需的,因为它将被下一行覆盖!myarray=new File[10];
13赞 muthu krishna 11/23/2012 #4
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());
        }

      }
    }
  }
}

评论

7赞 Martijn Pieters 11/24/2012
欢迎来到 Stack Overflow!与其只发布一个代码块,不如解释为什么这个代码可以解决所提出的问题。没有解释,这不是一个答案。
5赞 Adrien Hadj-Salah 5/15/2013 #5

如果您想要更多选项,可以使用此函数,该函数旨在填充文件夹中存在的文件的数组列表。选项有:递归性和模式匹配。

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

最好的,阿德里安

11赞 Sanket Thakkar 8/5/2013 #6
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
    }
}

评论

0赞 Sanket Thakkar 6/30/2014
这是Android的解决方案,从SD卡或内部存储中读取所有文件和文件夹。
13赞 Mark Spangler 8/16/2013 #7

在 Java 7 及更高版本中,您可以使用 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);
}

您还可以创建一个过滤器,然后可以将其传递到上述方法中newDirectoryStream

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

有关其他筛选示例,[请参阅文档]。(http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob)

评论

0赞 simgineer 11/10/2017
我对创建过滤器示例感到困惑。newDirectoryStream.Filter<Path>是什么。你能说明它是如何声明的吗?
0赞 simgineer 11/10/2017
我想我想通了。这是一个复制和粘贴的错别字。“new”和“DirectoryStream.Filter...”之间有一个空格。如果我是对的,建议纠正你的例子。
2赞 Mukesh Jha 9/25/2013 #8
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]);
             }
         }
     }
}
4赞 andrej 11/27/2013 #9

https://stackoverflow.com/a/286001/146745 上看到的很好的用法java.io.FileFilter

File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {          
    public boolean accept(File file) {
        return file.isFile();
    }
});

评论

0赞 andrej 10/13/2015
docs.oracle.com/javase/7/docs/api/java/io/......public File[] listFiles() 返回一个抽象路径名数组,表示由此抽象路径名表示的目录中的文件。
3赞 Santosh Rathod 12/23/2013 #10
    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]);
            }
        }
    }
0赞 ChetanTwr 1/1/2014 #11
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赞 Zar E Ahmer 5/16/2014 #12
/**
 * 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"));
        }
    }

您可以过滤任何文本文件或任何其他扩展名。只需将其替换为.MP3

9赞 micha 5/23/2014 #13

只需使用 (Java 7) 浏览所有文件Files.walkFileTree

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

评论

0赞 Thomas S. 10/7/2018
请注意,如果某些文件或目录无法读取文件属性,例如由于权限,则此代码将抛出异常(并且不会报告任何其他文件)。易于在“C:”上重现。
171赞 Julian Pieles 10/6/2014 #14

在 Java 8 中,您可以执行此操作

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

这将打印文件夹中的所有文件,同时排除所有目录。如果您需要列表,可以执行以下操作:

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

如果要返回,而不仅仅是映射它:List<File>List<Path>

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

您还需要确保关闭流!否则,您可能会遇到异常,告诉您打开的文件太多。阅读此处了解更多信息。

评论

3赞 XaolingBao 10/13/2014
收到 .map(Path::toFile) 错误 还有 .forEach(路径 -> System.out.println(path.toString()); 应该是 .forEach(path -> System.out.println(path.toString()));
2赞 XaolingBao 10/14/2014
它说“无效的方法引用,找不到符号”“方法到文件”是 toFile 应该是别的东西吗?
2赞 Julian Pieles 10/14/2014
你能把你的代码粘贴到PasteBin中吗?你在用吗?我刚刚检查了 toFile() 方法应该存在于 java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/ 之前......java.nio.file.Path
2赞 Julian Pieles 8/19/2015
@NadjibMami 请看这里: razem.io/blog/posts/year2015/0819_try_catch_lambda 被编译为在评论中回答。所以我写了一篇简短的博文。
2赞 Julian Pieles 12/2/2015
如果有人仍在寻找 try catch lambda 主题,我的博客网址已更改 -> razem.io/blog/y2015/0819_try_catch_lambda.html
0赞 shree 11/4/2014 #15

列出类路径中存在的 Test 文件夹中的文件

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


    }


}
3赞 Mohammad 2/25/2015 #16

我认为这是读取文件夹和子文件夹中所有文件的好方法

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);
    }
}
2赞 Subhojit Das 9/9/2015 #17
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);
            }
        }
    }
36赞 Martin 12/4/2015 #18

所有关于这个主题的答案都使用了新的 Java 8 函数,但都忽略了关闭流。接受的答案中的示例应为:

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

从方法的 javadoc 中:Files.walk

返回的流封装一个或多个 DirectoryStreams。如果 需要及时处理文件系统资源, 应使用 try-with-resources 构造来确保 Stream 的 Close 方法在流操作完成后调用。

评论

0赞 Rudolf Schmidt 5/17/2017
切勿使用 Stream 进行迭代。你获取一个 Stream 引用,使用它并通过它离开。
0赞 Roland 5/18/2017
你的意思是“扔掉它”@RudolfSchmidt?
3赞 Rudolf Schmidt 5/19/2017
我的意思是正确的方法是以这种方式使用它: Files.walk(Paths.get(“/home/you/Desktop”)).filter(Files::isRegularFile).forEach(filePath->...)
3赞 pdp 1/7/2017 #19

使用 Java 1.7 以递归方式列出命令行上指定目录中的文件的简单示例:

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赞 JamesC 5/19/2017 #20

虽然我同意 Rich、Orian 和其他人使用:

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

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

出于某种原因,这里的所有示例都使用绝对路径(即从根目录一直到根目录,或者,例如,Windows 的驱动器号 (C:\)..)

我想补充一点,也可以使用相对路径。 所以,如果你是 pwd(当前目录/文件夹)是 folder1 并且你想解析 folder1/subfolder,你只需写(在上面的代码中而不是):

    final File keysFileFolder = new File("subfolder");
3赞 GOXR3PLUS 5/29/2017 #21

Java 8 很好,当你感到痛苦时,它不会抛出 Avoid Java 8 Files.walk(..) 终止原因 ( java.nio.file.AccessDeniedException )Files.walk(..)

这是一个安全的解决方案,虽然不像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();
}
2赞 Salvador Valencia 7/20/2017 #22

只是为了扩展接受的答案,我将文件名存储到 ArrayList 中(而不仅仅是将它们转储到 System.out.println),我创建了一个帮助程序类“MyFileUtils”,以便它可以被其他项目导入:

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

我添加了文件名的完整路径。 你可以这样使用它:

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 由“value”传递,但该值用于指向位于 JVM 堆中的同一 ArrayList 对象。这样,每个递归调用都会将文件名添加到同一个 ArrayList 中(我们不会在每个递归调用上创建一个新的 ArrayList)。

2赞 moldovean 11/20/2017 #23

上面有很多很好的答案,这里有一个不同的方法:在 maven 项目中,默认情况下,您放在 resources 文件夹中的所有内容都会复制到 target/classes 文件夹中。查看运行时可用的内容

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

现在,要从特定文件夹中获取文件,假设您的资源文件夹中有一个名为“res”的文件夹,只需替换:

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

如果您想在 com.companyName 包中拥有访问权限,那么:

contextClassLoader.getResource("com.companyName");
1赞 Aris Mist 6/7/2018 #24

您可以将文件路径放在参数中,并创建一个包含所有文件路径的列表,而不是手动将其放入列表。然后使用 for 循环和读取器。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赞 Manas Ranjan Mahapatra 9/21/2018 #25
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());
            }
        }
    }

}
35赞 xxxception 1/30/2019 #26

一个备注,根据获取目录中的所有文件。
该方法将通过遍历根植于给定启动文件的文件树来返回所有文件。
Files.walk(path)

例如,有下一个文件树:

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

使用:java.nio.file.Files.walk(Path)

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

给出以下结果:

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

要仅获取当前目录中的所有文件,请使用:java.nio.file.Files.list(Path)

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

结果:

folder\file1.txt
folder\file2.txt

评论

2赞 Arka Mallick 2/14/2020
这应该是2020年这个问题的唯一答案:)
0赞 Per Lundberg 3/12/2020
为该示例点赞。如果您不想以递归方式搜索,有时这可能是最佳选择。Files.list
0赞 john k 8/26/2020
由于某种原因,java.nio.file.Files 对我来说不存在
0赞 FSm 10/6/2020
AND,仅返回文件,不返回文件夹Files.list
0赞 Serphentelm 6/30/2022
例如,如果我想查找所有文件,只查找.pdf文件怎么办?如何使用匹配功能?
1赞 Vishal Vijayan 12/2/2020 #27

我们可以使用 org.apache.commons.io.FileUtils,使用 listFiles() mehtod 来读取给定文件夹中的所有文件。

例如:

FileUtils.listFiles(directory, new String[] {"ext1", "ext2"}, true)

这将读取给定目录中具有给定扩展名的所有文件,我们可以在数组中传递多个扩展名,并在文件夹(true 参数)中递归读取。

1赞 seunggabi 1/10/2022 #28
public static List<File> files(String dirname) {
    if (dirname == null) {
        return Collections.emptyList();
    }

    File dir = new File(dirname);
    if (!dir.exists()) {
        return Collections.emptyList();
    }

    if (!dir.isDirectory()) {
        return Collections.singletonList(file(dirname));
    }

    return Arrays.stream(Objects.requireNonNull(dir.listFiles()))
        .collect(Collectors.toList());
}
2赞 Collin 3/18/2023 #29

使用 .map 获取所有文件名的单行:yourDirectory

List<String> files = Files.list(Paths.get(yourDirectory)).map(path -> path.getFileName().toFile().getName()).collect(Collectors.toList());

2赞 Nadav Ruskin 7/28/2023 #30

下面是获取目录中文件列表的简短方法:

        File directory = new File("path");
        File[] files = directory.listFiles(File::isFile);