如何用Java列出目录中的所有文件

时间:2020-01-09 10:35:30  来源:igfitidea点击:

有时我们可能需要列出目录中的所有文件以获取特定文件,读取所有文件或者将文件夹压缩到需要浏览整个文件夹树结构的位置。这篇文章展示了如何用Java递归列出目录中的所有文件和子目录。

在Java目录中列出文件和子目录

要列出包含子目录和所有文件的文件夹树结构,可以使用以下选项之一:

  • 使用File.listFiles()方法返回代表目录中文件的抽象路径名数组。然后,我们可以迭代数组以列出文件,我们将必须递归地调用方法以在子目录中列出文件。参见示例。
  • 从Java 7开始,我们可以使用Files.walkFileTree方法,该方法遍历以给定起始文件为根的文件树。参见示例。
  • 从Java 8开始,我们可以使用Files.walk()方法,该方法通过遍历以给定起始文件为根的文件树来将Path对象作为流返回。参见示例。

使用的目录结构

此处显示的列出Java目录中所有文件的Java程序使用以下目录结构。

在父文件夹中有一个子文件夹,子文件夹有两个文件,一个文件存储在父文件夹中。

使用File.listFiles()方法列出Java中的所有文件

public class ListDirStructure {

  public static void main(String[] args) {
    final String SOURCE_PATH = "F:/theitroad/Parent";
    File sourceDir = new File(SOURCE_PATH);
    listAllFiles(sourceDir);
  }

  public static void listAllFiles(File sourceDir){
    File[] fileList = sourceDir.listFiles();
    for(File file : fileList){
      // if directory, call method recursively
      if(file.isDirectory()){
        System.out.println("Sub Directory-" + file.getName());
        listAllFiles(file);
      }else{
        System.out.println("File-" + file.getAbsolutePath());
      }
    }
  }
}

输出:

Sub Directory-Child
File-F:\theitroad\Parent\Child\hello.txt
File-F:\theitroad\Parent\Child\Project.docx
File-F:\theitroad\Parent\Test.txt

使用Files.walkFileTree()方法列出Java中的所有文件

此方法的参数之一是FileVisitor接口。我们确实需要根据需要提供此接口的实现。

FileVisitor界面有四种方法,要列出文件夹中的文件,我们确实需要实现其中两种。 preVisitDirectory和visitFile。

对于此示例,在Parent内部添加了一个不包含文件的子目录Empty。

public class ListDirStructure {
  public static void main(String[] args) {
    final String SOURCE_PATH = "F:/theitroad/Parent";
    listAllFiles(SOURCE_PATH);
  }

  private static void listAllFiles(String sourceFolder){
    Path sourcePath = Paths.get(sourceFolder);
    // Walk the tree structure using WalkFileTree method
    try {
      Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>(){
        @Override
        // Before visiting the directory
        public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException {
          // Don't create dir for root folder as it is already created with .zip name 
          if(!sourcePath.equals(dir)){
            System.out.println("Directory- " + dir);
          }
          return FileVisitResult.CONTINUE;
        }
        @Override
        // For each visited file add it to zip entry
        public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
          System.out.println("File Name- " + sourcePath.relativize(file).toString());                 
          return FileVisitResult.CONTINUE;
        }
      });
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

输出:

Directory- F:\theitroad\Parent\Child
File Name- Child\hello.txt
File Name- Child\Project.docx
Directory- F:\theitroad\Parent\Empty
File Name- Test.txt

使用Files.walk()方法列出Java中的所有文件

public class ListDirStructure {
  public static void main(String[] args) {
    final String SOURCE_PATH = "F:/theitroad/Parent";
    listAllFiles(SOURCE_PATH);
  }
    
  // Uses Files.walk method   
  public static void listAllFiles(String path){
    try(Stream<Path> filePaths = Files.walk(Paths.get(path))) {
      filePaths.forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
          System.out.println("File-" + filePath);
        }else{
          // check for source directory
          if(!filePath.toString().equals(path))
            System.out.println("Sub Directory-" + filePath);
        }
      });
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}