【发布时间】:2014-05-11 15:06:14
【问题描述】:
因为 java.io.File 的构造函数以 java.lang.String 作为参数,所以似乎不可能告诉它在访问文件系统层时期望使用哪种文件名编码。因此,当您通常使用 UTF-8 作为文件名编码并且有一些文件名包含编码为 ISO-8859-1 的变音符号时,您基本上是 **。这是正确的吗?
更新:因为似乎没有人得到它,所以自己尝试一下:创建新文件时,环境变量 LC_ALL(在 Linux 上)确定文件名的编码。 你在源代码中做了什么并不重要!
如果您想给出正确答案,请证明您可以使用正确的 ISO-8859-1 编码创建文件(使用常规 Java 方法),而您的 JVM 假定 LC_ALL=en_US.UTF-8。文件名应包含 ö、ü 或 ä 等字符。
顺便说一句:如果您将编码不适合 LC_ALL 的文件名放入 maven 的资源路径中,它将跳过它......
更新二。
修复此问题:https://github.com/jjYBdx4IL/filenameenc
即。使 f.exists() 语句变为真。
更新 III。
解决方案是使用 java.nio.*,在我的情况下,您必须将 File.listFiles() 替换为 Files.newDirectoryStream()。我已经更新了 github 上的示例。顺便说一句:maven 似乎仍在使用旧的 java.io API.... mvn clean 失败。
【问题讨论】:
-
file.encoding确定读取文本文件时使用的默认字符集。它与文件名无关。 -
另外,如果你使用Java 7+,你真的应该使用java.nio.file
-
然后在 github 上查看我的测试用例。那肯定是错的。对于您的第二个建议:您真的希望使用 JDK 7 来从名称不好的文件中删除吗?
-
你会因为许多其他原因想要使用 JDK7,比如 JDK6 不再被官方支持。
标签: java encoding character-encoding