0

SimpleFileVisitor用来搜索文件。它在 Windows 和 Linux 上运行良好。但是,当我尝试在 Unix 之类的操作系统上使用它时,它并没有按预期工作。我会收到这样的错误:

java.nio.file.NoSuchFileException:
   /File/Location/MyFolder/\u0082\u0096\u0096âĜu0099\u0081\u0097K
                           \u0097\u0099\u0096\u0097\u0085\u0099Ĝu0089\u0085

看起来获得的名称采用不同的字符编码,这可能是导致问题的原因。看起来在获取名称和尝试获取对文件的访问权之间,编码被遗漏了。这导致它尝试访问的每个文件都调用preVisitDirectory一次。visitFileFailed我不确定为什么该walkFileTree方法会这样做。任何想法?

我的SimpleFileVisitor代码使用如下所示:

 Files.walkFileTree(serverLocation, finder);

我的SimpleFileVisitor班级:

public class Finder extends SimpleFileVisitor<Path> {    
  private final PathMatcher matcher;
  private final List<Path> matchedPaths = new ArrayList<Path>();
  private String usedPattern = null;
  Finder(String pattern) {
    this.usedPattern = pattern;
    matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
  }

  void match(Path file) { //Compare pattern against file or dir
    Path name = file.getFileName();
    if (name != null && matcher.matches(name))
        matchedPaths.add(file);
  }

  // Check each file.
  @Override
  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
    match(file);
    return CONTINUE;
  }

  // Check each directory.
  @Override
  public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
    match(dir);
    return CONTINUE;
  }

  @Override
  public FileVisitResult visitFileFailed(Path file, IOException e) {
    System.out.println("Issue: " + e );
    return CONTINUE;
}
4

1 回答 1

1

在创建传递的“文件”和“目录”字符串时尝试使用“Charset.defaultCharset()”。否则,您很可能会在创建这些字符串的过程中破坏名称以将它们传递给您的访问方法。

您还可以检查您正在运行的 JVM 上的默认编码,如果它与您正在读取的文件系统不同步,您的结果将是错误的、不可预测的。

于 2015-05-29T05:20:09.263 回答