如何在 Java 中使用 SimpleFileVisitor 查找编码可能不同的文件名?

Posted

技术标签:

【中文标题】如何在 Java 中使用 SimpleFileVisitor 查找编码可能不同的文件名?【英文标题】:How do I use SimpleFileVisitor in Java to find a file name whose encoding may vary? 【发布时间】:2015-05-28 21:52:15 【问题描述】:

我正在使用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;

【问题讨论】:

通常,当您看到“â”字符时,表示您有一个被解释为 ISO-8859-1 或 WIN-1252 的 UTF-8 流。 “â”是来自 UTF-8 的多字节指示符,被误译。 【参考方案1】:

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

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

【讨论】:

以上是关于如何在 Java 中使用 SimpleFileVisitor 查找编码可能不同的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java在mysql中使用\\更新文件路径?

如何在 Java 中使用 SOAP Web 服务

如何使用 AES 在 Java 中加密文件 [重复]

java - 如何在文件路径中使用空格从java调用ghostscript

如何在 Java 中使用 keyTyped?

如何在 Java 中使用 Comparator 进行排序