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

785
如何通过Java读取文件夹中的所有文件?使用哪个API无关紧要。

10
我同意,请指出要使用的类,这样海报就可以熟悉各种方法,否则海报就不会费心去阅读API以查找其他可用的方法。 - camickr
6
你的意思是指一个文件夹中的所有文件,还是包括这个文件夹以及其所有子文件夹中的所有文件? - Jim Garrison
3
API的最新链接:http://docs.oracle.com/javase/7/docs/api/java/io/File.html。 - Tom Duckering
2
如果您使用的是Java 7或更高版本,您可以使用Files.walkFileTree方法,详见https://dev59.com/PXI-5IYBdhLWcg3wc4Cw#23814217。 - micha
35个回答

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
你可能想要添加一个解释,说明你想要实现什么,而不是仅仅展示代码。此外,myarray=new File[10]; 不是必须的,因为它会被下一行代码覆盖! - Veger

4

https://dev59.com/SnVC5IYBdhLWcg3wdw65#286001中,看到了java.io.FileFilter的好用方法。

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

public File[] listFiles()返回一个抽象路径名数组,表示由此抽象路径名所表示的目录中的文件。 - 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

虽然我同意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
我认为这是一种很好的方法,可以读取文件夹及其子文件夹中的所有文件。
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

这是一个与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

Java 8 Files.walk(..) 是一个不错的工具,当你确信它不会抛出(java.nio.file.AccessDeniedException)时,使用它可以得心应手。

下面是一种安全解决方案,虽然不如Java 8Files.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

为了扩展已接受的答案,我将文件名存储到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是按“值”传递的,但该值用于指向存储在JVM堆中的同一ArrayList对象。这样,每个递归调用都会将文件名添加到同一个ArrayList中(我们并不是在每个递归调用中创建新的ArrayList)。


2

以上有很多好的答案,这里提供一种不同的方法:在maven项目中,您放置在资源文件夹中的所有内容默认都会复制到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");

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接