当走遍linux机器的文件树(也许还有其他Unix)时,我会遇到用不同编码编码的文件或目录名,而不是Java默认字符集(Charset.defaultCharset())返回的编码。 这是因为用户可以更改他的语言环境并编写一个文件或目录,其名称是使用用户的自定义语言环境编码的。
我想要遍历整个文件系统(例如使用Files.walkFileTree),并且遇到的每个文件/目录总是能够存储一些东西,以便我以后可以成功地创建一个新的Path对象到该文件/目录。
但是,如果遇到名称使用未知编码进行编码的文件/目录,我将无法再次访问该文件。
为了证明这个问题,在RHEL6机器上我有一个“/ home / languages”下的目录,其名称编码为编码he_IL.iso88598,系统的语言环境也是he_IL.iso88598 以下代码使用平台的默认编码对名称进行一次解码,并将其一次解码为UTF-8:
Path source = Paths.get("/home/languages");
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
String badName = new String(dir.toString().getBytes("UTF8"));
String name = dir.toString();
Files.exists(Paths.get(name));
Files.exists(Paths.get(badName))
return FileVisitResult.CONTINUE;
}
});
抛出以下异常:
Exception in thread "main" java.nio.file.InvalidPathException: Malformed input or input contains unmappable chacraters: /home/languages/?¢??¨??×
即使在walkFileTree期间他们的编码未知,Java也能够访问文件/目录,为什么我不能再次访问这些路径?
由于
答案 0 :(得分:0)
看到这个讨论: How can I open files containing accents in Java?
并且: How to fix java when if refused to open a file with special charater in filename?
文件库中已知的旧错误
使用java.nio.file包(文件和路径)的建议