java.io.File:使用无效的文件名编码访问文件

use*_*755 6 java encoding character-encoding

因为java.io.File的构造函数采用java.lang.String作为参数,所以似乎不可能告诉它在访问文件系统层时期望使用哪种文件名编码。因此,当您通常使用UTF-8作为文件名编码,并且有一些文件名包含编码为ISO-8859-1的变音符号时,基本上就是**。它是否正确?

更新:因为似乎没有人得到它,所以请自己尝试:创建新文件时,环境变量LC_ALL(在Linux上)确定文件名的编码。在源代码中做什么都没关系!

如果要给出正确的答案,请说明您可以在JVM假定LC_ALL = en_US.UTF-8的情况下,使用正确的ISO-8859-1编码创建文件(使用常规Java手段)。文件名应包含ö,ü或ä等字符。

顺便说一句:如果您将编码不适合LC_ALL的文件名放入maven的资源路径中,它将跳过它。

更新II。

解决此问题:https : //github.com/jjYBdx4IL/filenameenc

即。使f.exists()语句变为true。

更新III。

解决方案是使用java.nio。*,在我的情况下,您必须将File.listFiles()替换为Files.newDirectoryStream()。我已经在github上更新了示例。顺便说一句:maven似乎仍然使用旧的java.io API。...mvn clean失败。

fge*_*fge 5

解决方案是使用新的 API 和file.encoding. 示范:

\n\n
fge@alustriel:~/tmp/filenameenc$ echo $LC_ALL\nen_US.UTF-8\nfge@alustriel:~/tmp/filenameenc$ cat Test.java\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\npublic class Test\n{\n\n    public static void main(String[] args)\n    {\n        final String testString = "a/\xc3\xbc\xc3\xb6\xc3\xa4";\n        final Path path = Paths.get(testString);\n        final File file = new File(testString);\n        System.out.println("Files.exists(): " + Files.exists(path));\n        System.out.println("File exists: " + file.exists());\n    }\n}\nfge@alustriel:~/tmp/filenameenc$ install -D /dev/null a/\xc3\xbc\xc3\xb6\xc3\xa4 \nfge@alustriel:~/tmp/filenameenc$ java Test\nFiles.exists(): true\nFile exists: true\nfge@alustriel:~/tmp/filenameenc$ java -Dfile.encoding=iso-8859-1 Test\nFiles.exists(): false\nFile exists: true\nfge@alustriel:~/tmp/filenameenc$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

少了一个使用理由File

\n