如何在 Java 中使用 SimpleFileVisitor 来查找编码可能不同的文件名?
How do I use SimpleFileVisitor in Java to find a file name whose encoding may vary?
我正在使用 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
class:
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;
}
在创建传递的 "file" 和 "dir" 字符串时尝试使用 "Charset.defaultCharset()"。否则,您很可能会在创建这些字符串以将它们传递给您的访问方法的过程中破坏名称。
您还可以检查 JVM 上的默认编码 运行,如果它与您正在读取的文件系统不同步,您的结果将是不可预测的,错误的。
我正在使用 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
class:
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;
}
在创建传递的 "file" 和 "dir" 字符串时尝试使用 "Charset.defaultCharset()"。否则,您很可能会在创建这些字符串以将它们传递给您的访问方法的过程中破坏名称。
您还可以检查 JVM 上的默认编码 运行,如果它与您正在读取的文件系统不同步,您的结果将是不可预测的,错误的。