【问题标题】:Using Java's file tree system to get only files and folders not subdirectories使用 Java 的文件树系统只获取文件和文件夹而不是子目录
【发布时间】:2015-10-17 15:34:15
【问题描述】:

所以我必须使用 Java 文件树系统,因为 .listfiles 文件由于某种原因在通过远程网络时速度非常慢。然而,所有 Java 文件树系统示例都列出了子目录中的所有文件,从而严重降低了程序的速度。我怎样才能使它只搜索目录并只返回该目录中的文件夹和文件的名称,而不是子目录。

示例代码:

package javaapplication6;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

/** Recursive listing with SimpleFileVisitor in JDK 7. */
public final class JavaApplication6 {

  public static void main(String... aArgs) throws IOException{
    String ROOT = "\\\\directory";
    FileVisitor<Path> fileProcessor = new ProcessFile();
    Files.walkFileTree(Paths.get(ROOT), fileProcessor);
  }

  private static final class ProcessFile extends SimpleFileVisitor<Path> {
    @Override public FileVisitResult visitFile(
      Path aFile, BasicFileAttributes aAttrs
    ) throws IOException {
      System.out.println("Processing file:" + aFile);
      return FileVisitResult.CONTINUE;
    }

    @Override  public FileVisitResult preVisitDirectory(
      Path aDir, BasicFileAttributes aAttrs
    ) throws IOException {
      System.out.println("Processing directory:" + aDir);
      return FileVisitResult.CONTINUE;
    }
  }
} 

任何见解或帮助将不胜感激,谢谢。

【问题讨论】:

  • 如果你不想递归遍历文件,为什么要使用Files.walkFileTree?您可以只使用带有过滤器的DirectoryStream
  • walkfiletree 不是更快吗?
  • 这不是速度问题,而是目的问题:walkFileTree 顾名思义,设计为遍历文件树,这意味着在子目录中递归。如果您只想列出文件夹的内容(没有递归),则应该使用 DirectoryStream。此类旨在处理非常非常大的目录。
  • 你确定吗?因为这里:bugs.openjdk.java.net/browse/JDK-8008469 建议的解决方案是使用 walkfiletree
  • 从您链接到的错误中读取this comment 表明它比这更棘手。性能问题似乎与Files.isDirectory 相关,但如果您只是使用DirectoryStream 列出目录条目,则无需调用此方法。我建议您尝试此解决方案,看看您是否遇到任何性能问题。

标签: java filetree filevisitor file-traversal


【解决方案1】:

使用目录流似乎更快速、更轻松。

【讨论】:

    【解决方案2】:

    使用较长版本的walkFileTree 方法,允许您像这样设置maxDepth

    Files.walkFileTree(Paths.get(ROOT), EnumSet.noneOf(FileVisitOption.class),
       1, fileProcessor);
    

    请注意,与简单的情况不同,ROOT 的子目录会生成对visitFile 的调用。更一般地,maxDepth 级别的子目录会调用 visitFile,但不会调用 preVisitDirectorypostVisitDirectory

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多