Java File.listFiles()根据`exists()`返回“不存在”的文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java File.listFiles()根据`exists()`返回“不存在”的文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1789字,纯文字阅读大概需要3分钟。
内容图文
![Java File.listFiles()根据`exists()`返回“不存在”的文件](/upload/InfoBanner/zyjiaocheng/788/58aabe5134944c5b9f78567361e7be17.jpg)
我在生产代码中发现了这个问题:
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)
根本原因是:
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!!"));
}
}
}
输出:
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
“缺失”文件以符号“μ” (Mu)和“€” (Euro)命名.
似乎这些文件名使用了错误的编码.
当我在bash中列出文件时,它们也显示错误.
当我将ls的输出从latin1转换为UTF-8时,它们正确显示(至少为mu).
但尽管如此 …
>这些文件存在
> file.listFiles()列出它们
>对于2个特殊情况:file.exists()返回false
我相信这是JVM中的一个错误.任何人都可以证实吗?
是否已有错误报告?任何想法如何解决这一问题? (重命名文件不是一个选项,因为它们是用户生成的,可能会以任何形式或形状重新出现.)
我的系统:
> Ubuntu 4.2.0
> java版“1.8.0_102”
> Java(TM)SE运行时环境(版本1.8.0_102-b14)
> Java HotSpot(TM)64位服务器VM(内置25.102-b14,混合模式)
> Apache Commons IO 2.4
解决方法:
它不是错误,它是文件系统中缺少编码信息的结果.
Java无法正确表示文件名,因为它不知道编码.因此,如果没有指定正确的编码,则无法从Java访问该文件.
解决此问题的最简单方法是正确设置file.encoding属性,并在所有文件名中使用该编码.
编辑:我发现一篇文章,显示另一种可能的行为,也许更改文件.编码没有帮助.如果你想使用UTF-8以外的东西,最好测试一下. http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/
我也找到了相关的讨论:Setting file name encoding
内容总结
以上是互联网集市为您收集整理的Java File.listFiles()根据`exists()`返回“不存在”的文件全部内容,希望文章能够帮你解决Java File.listFiles()根据`exists()`返回“不存在”的文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。