我正在使用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());
}
答案 0 :(得分:1)
在创建传递的“文件”和“目录”字符串时尝试使用“Charset.defaultCharset()”。否则,你很可能在创建这些字符串的过程中破坏名称,将它们传递给你的访问方法。
您也可以检查正在运行的JVM上的默认编码,如果它与您正在阅读的文件系统不同步,则结果将是错误的,不可预测的。