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

取得した名前の文字エンコーディングが異なるようで、それが問題の原因である可能性があります。名前を取得してからファイルへのアクセスを取得しようとしている間に、エンコーディングが失われているようです。これにより、アクセスしようとするファイルごとにpreVisitDirectory1 回呼び出すことになります。メソッドがそれを行う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

渡す「file」および「dir」文字列を作成するときは、「Charset.defaultCharset()」を使用してみてください。そうしないと、これらの文字列を作成する過程で名前を壊して、visit メソッドに渡す可能性が非常に高くなります。

また、実行中の JVM でデフォルトのエンコーディングを確認することもできます。読み込み中のファイル システムと同期していない場合、結果は予測不能になります。

于 2015-05-29T05:20:09.263 に答える