【发布时间】:2015-12-01 16:23:04
【问题描述】:
在浏览 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/?¢??¨??×
Java 能够访问文件/目录,即使在 walkFileTree 期间它们的编码是未知的,为什么我不能再次访问这些路径?
谢谢
【问题讨论】:
标签: java encoding filenames nio