如何在EUC-KR编码系统下用Java读取UTF-8编码的文件名?
解决Java读取UTF-8文件名(系统为EUC-KR编码)的问题
这个问题我之前处理过,核心原因是Java旧版File API依赖JVM默认字符编码,而你的系统默认是EUC-KR,当文件名实际是UTF-8编码时,用EUC-KR去解码UTF-8字节会导致文件名乱码——乱码后的文件名对应不上系统里真实的文件路径,所以isFile()和isDirectory()都会返回false,因为JVM找不到这个“不存在”的文件。
下面给你两个可行的解决方案:
方案一:使用NIO的Path和Files API(推荐)
Java 7引入的NIO API对文件名编码的支持更灵活,能更好地适配不同编码的文件名,不需要依赖系统默认编码。示例代码如下:
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; public class Utf8FileReader { public static void main(String[] args) { String dirPath = "你的目标目录路径"; Path dir = Paths.get(dirPath); // 遍历目录下的所有文件/目录 try (Stream<Path> pathStream = Files.list(dir)) { pathStream.forEach(path -> { // 获取正确编码的文件名 String fileName = path.getFileName().toString(); System.out.println("文件名:" + fileName); // 正确判断文件/目录类型 System.out.println("是否为文件:" + Files.isRegularFile(path)); System.out.println("是否为目录:" + Files.isDirectory(path)); System.out.println("---"); }); } catch (Exception e) { e.printStackTrace(); } } }
这个方案不依赖系统编码,能直接正确识别UTF-8编码的文件名,而且NIO API本身也比旧的File API更健壮。
方案二:修改JVM启动参数(兼容旧代码)
如果你必须继续使用File API,可以在启动Java程序时添加以下JVM参数,强制JVM用UTF-8处理文件名和文件内容:
-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8
sun.jnu.encoding是JVM处理文件名的编码参数file.encoding是处理文件内容的编码参数
注意:这个参数是Oracle JVM的特定参数,其他JVM(比如OpenJDK)虽然大部分也支持,但可能存在兼容性问题,所以优先推荐方案一。
另外,你之前尝试的new String(fileList[0].getName().getBytes("euc-kr"), "euc-kr")是无效的,因为文件名已经被JVM用EUC-KR解码错误了,再转一次编码也无法还原正确的UTF-8文件名。
内容的提问来源于stack exchange,提问作者이진희
相关产品推荐
相关产品推荐

