Fre*_*ger 6 java encoding file
我在我们的生产代码中注意到了这个问题:
java.lang.IllegalArgumentException: /somePath/?.png does not exist
at org.apache.commons.io.FileUtils.sizeOf(FileUtils.java:2413)
at org.apache.commons.io.FileUtils.sizeOfDirectory(FileUtils.java:2479)
Run Code Online (Sandbox Code Playgroud)
根本原因是这样的:
import java.io.File;
public class FileNameTest
{
public static void main(String[] args)
{
File[] files = new File("/somePath").listFiles();
for (File file : files)
{
System.out.println(file + " - " + (file.exists() ? "exists" : "missing!!"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
0.png - exists
7.png - exists
4.png - exists
8.png - exists
1.png - exists
3.png - exists
?.png - missing!!
2.png - exists
5.png - exists
?.png - missing!!
6.png - exists
d.png - exists
$.png - exists
s.png - exists
+.png - exists
9.png - exists
Run Code Online (Sandbox Code Playgroud)
这些文件名使用错误的编码似乎也是这种情况。当我在 bash 中列出文件时,它们也显示错误。当我将lslatin1的输出转换为 UTF-8 时,它们显示正确(至少是 mu)。
但尽管如此 ...
我相信这是JVM中的一个错误。有人可以证实这一点吗?
是否已经有错误报告?任何想法如何解决这一问题?(重命名文件不是一个选项,因为它们是用户生成的,并且可能以任何形式或形状重新出现。)
我的系统:
这不是错误,而是文件系统中缺少编码信息的结果。Java 无法正确表示文件名,因为它不知道编码。因此,如果不指定正确的编码,则无法从 Java 访问该文件。
解决此问题的最简单方法是正确设置file.encoding属性,并在所有文件名中使用该编码。
编辑:我发现一篇文章显示了另一种可能的行为,也许更改file.encoding没有帮助。如果您想使用 UTF-8 以外的其他内容,请更好地测试它。http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/
我还发现了一个相关的讨论:设置文件名编码