访问名称带有未知编码的文件

时间:2015-12-01 16:23:04

标签: java encoding filenames nio

当走遍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也能够访问文件/目录,为什么我不能再次访问这些路径?

由于

1 个答案:

答案 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包(文件和路径)的建议