若路径包含非拉丁字符,Mac OS 上的Java会出现“FileNotFound”错误

3

大家好,有个好消息。

我在我的Mac OS上发现了一个与Java相关的有趣问题。

我将一个文件以非拉丁字符的名称命名,并放置在test文件夹中,完整路径为/Users/dnelepov/Downloads/test/тест изображение.png

enter image description here

正如您所看到的,文件已存在!

接下来,我编写了一些代码来查看/Users/dnelepov/Downloads/test/文件夹中的所有文件并打开文件进行读取(例如):

File dirF = new File("/Users/dnelepov/Downloads/test/");
            File[] files = dirF.listFiles();
            for (File oneF : files) {
                System.out.println("FILE:" + oneF);
                if (oneF.exists()){
                    System.out.println("EXISTS:"+oneF);
                }
            }

但接下来我得到了这个:

输入图像描述

如您所见,行EXSIS:从未被打印出来,但文件是找到的!

同时打印系统属性:

file.encoding=UTF-8

p.s.

我之前问过类似类型的问题Java java.io.filenotfoundexception for file path with cyrillic characters - 但是我认为这个问题不仅适用于西里尔文字母 - 适用于所有非拉丁语言。

1个回答

3
在Java 7中,您可以使用java.nio.file API,它可以正确处理带有西里尔文路径的情况:
    Path path = Paths.get("/Users/dnelepov/Downloads/test/");
    Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path oneF, BasicFileAttributes attrs) throws IOException {
            System.out.println("FILE:" + oneF);
            if (Files.exists(oneF)) {
                System.out.println("EXISTS:" + oneF);
            }
            return FileVisitResult.CONTINUE;
        }
    });

将此答案添加到https://dev59.com/GWQn5IYBdhLWcg3wRVVs?rq=1。 - Dmitry Nelepov
简单回顾一下:new FileInputStream(path.toFile) 存在这个问题,但是 Files.newInputStream(path) 却没有。 - Tvaroh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接