java .listfiles_Java File.listFiles()根据`exists()`返回“不存在”的文件

我在生产代码中发现了这个问题:

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

似乎这些文件名使用了错误的编码.

当我在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属性,并在所有文件名中使用该编码.

标签:java,file,encoding

来源: https://codeday.me/bug/20190627/1309577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值