如何从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个回答

2
使用 .map 的一行代码来获取 yourDirectory 中的所有文件名: List<String> files = Files.list(Paths.get(yourDirectory)).map(path -> path.getFileName().toFile().getName()).collect(Collectors.toList());

2
这里是一个简短的代码片段,用于获取目录中文件的列表:
        File directory = new File("path");
        File[] files = directory.listFiles(File::isFile);

2
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
您可以将文件路径作为参数传递,并创建一个包含所有文件路径的列表,而不是手动将其放入列表中。然后使用for循环和reader。例如,对于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());
            }
        }
    }

}

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

1
我们可以使用org.apache.commons.io.FileUtils,使用listFiles()方法读取给定文件夹中的所有文件。
例如:
FileUtils.listFiles(directory, new String[] {"ext1", "ext2"}, true)

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

0

此代码将读取给定路径中指定文件扩展名的文件(也会查看子文件夹)

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

抱歉,如果这是一个新手问题,那么我应该传递什么作为“文件容器”? - Pramesh Bajracharya

0

这将很好地工作:

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
列出类路径中 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()));
                }
            }
        }


    }


}

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