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

M.J*_*.J. 626 java directory io file

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

ric*_*ich 926

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);
Run Code Online (Sandbox Code Playgroud)

Files.walk API可从Java 8获得.

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

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

  • 在Java 8中,您还可以使用`filter`方法.然后forEach不再需要了.请参阅此处 - > http://stackoverflow.com/a/26215931/1029251 (16认同)
  • `getName()`只会在其目录中给出文件的名称,该目录可能是原始文件的子目录.如果您打算使用此信息来查找文件,您可能会发现`getPath()`给出的路径更有用. (9认同)
  • 我是否可以使用此方法在整个系统中查找特定类型的所有文件,例如pdf或html?我关注的是效率,它是否足够快,可以用于拥有数千个文件的系统,还是有更好的选择? (4认同)
  • 只是为了表明它只被初始化一次. (3认同)

Dav*_*les 168

File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @sam1370因为这不会读取目录中的所有文件,所以它只直接获取给定目录内的文件。如果给定目录本身包含其他目录,则不会读取它们的内容 (3认同)
  • 我认为这将打印目录名称,而不是文件名 (2认同)

Jul*_*les 119

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

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

这将打印文件夹中的所有文件,同时排除所有目录.如果您需要一个列表,以下内容将:

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

如果你想返回List<File>而不是List<Path>只是映射它:

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

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

  • 使用.map(Path :: toFile)获取错误另外.forEach(path - > System.out.println(path.toString());应该是.forEach(path - > System.out.println(path.toString( ))); (3认同)
  • 它说"无效的方法引用,找不到符号""Method toFile"是文件应该是别的吗? (2认同)
  • 您可以将您的代码粘贴到PasteBin中吗?你在使用`java.nio.file.Path`吗?我刚刚检查了方法toFile()应该存在于java 8之前 - > http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#toFile() (2认同)
  • @NadjibMami请看这里:http://razem.io/blog/posts/year2015/0819_try_catch_lambda在评论中被编译回答.所以我写了一篇快速的博文. (2认同)
  • 如果有人还在寻找try catch lambda主题,我的博客网址已被更改 - > https://razem.io/blog/y2015/0819_try_catch_lambda.html (2认同)

Mar*_*tin 23

关于该主题的所有使用新Java 8函数的答案都忽略了关闭流.接受的答案中的例子应该是:

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

Files.walk方法的javadoc :

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

  • 我的意思是正确的方法是这样使用它: Files.walk(Paths.get("/home/you/Desktop")).filter(Files::isRegularFile).forEach(filePath-&gt;...) (3认同)

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

      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到 !请解释*为什么此代码解决了所提出的问题,而不是仅发布一段代码.没有解释,这不是答案. (6认同)

San*_*kar 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ler 9

在Java 7中,您现在可以这样做 - 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);
}
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个过滤器,然后将其传递给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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

其他过滤示例 - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob


mic*_*cha 7

使用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;
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您想要更多选项,可以使用此功能,该功能旨在填充文件夹中存在的文件的arraylist.选项包括:recursivility和匹配模式.

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;
}
Run Code Online (Sandbox Code Playgroud)

最好的,阿德里安


小智 5

一句话根据获取目录中的所有文件。
该方法Files.walk(path)将通过遍历以给定启动文件为根的文件树来返回所有文件。

例如,存在下一个文件树:

\---folder
    |   file1.txt
    |   file2.txt
    |
    \---subfolder
            file3.txt
            file4.txt
Run Code Online (Sandbox Code Playgroud)

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

Files.walk(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

给出以下结果:

folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt
Run Code Online (Sandbox Code Playgroud)

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

Files.list(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

结果:

folder\file1.txt
folder\file2.txt
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 2020 年这个问题唯一的答案了:) (2认同)