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

时间:2015-05-28 21:52:16

标签: character-encoding java-7 zos filetree

我正在使用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; } 课程:

            var lines1 = File.ReadLines(path);
            List<string> apollo = lines1.Take(7678).ToList();
            List<string> sabre = lines.Skip(7678).Take(5292).ToList();
            var g = apollo.GroupBy(i => i);
            foreach (var grp in g)
            {
                Console.WriteLine("{0} {1}", grp.Key, grp.Count());
            }

1 个答案:

答案 0 :(得分:1)

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

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