Java java.io.filenotfoundexception for file path with cyrillic character

我有一个文件,其名称不仅包含来自普通ASCII字符集的字符,还包含来自非ASCII字符集的字符。在我的情况下,它包含西里尔字符。

这是我的代码片段:

String fileName = "/Users/dnelepov/Downloads/тест изображение.png";
File sendFile = new File(fileName);
if (sendFile.exists()) {
    // Some code
}

块中的代码未执行。sendFile.existsif

为什么无法识别文件?

我的系统配置区域设置

LANG="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_CTYPE="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_ALL="ru_RU.UTF-8"

uname -a

Darwin Dmitrys-MacBook-Pro.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64

java -version

java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b12)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

更新

我发现这个错误是在甲骨文的JDK上。

我在Eclipse上创建了项目,并找到了文件。我检查了项目属性并找到了Mac OS 6 JDK。

然后我把它改成JDK 7,文件再次找不到。

我的问题是我需要将JDK 7与JavaFX一起使用。不是 Mac OS 版本。所以我的问题仍然存在。

我制作了一个视频来显示此错误 视频有错误

更新 2

感谢eumust的答案,这段代码的工作原理是:

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://stackoverflow.com/a/17481204/849961


答案 1

只是为了踢球,这个黑客可能会起作用:

String fDir = "/Users/dnelepov/Downloads/";
char[] fileName = "тест изображение.png".toCharArray();
File root = new File(fDir);
File[] folder = root.listFiles();

for (File f : folder) 
    if (Array.equals(fileName, f.getName().toCharArray()) {
        //code here
          ...
    }

我不知道它是否会为您带来任何不同的结果,特别是因为它可能只是文件名的一个奇怪的编码问题,但这可能有助于阐明这种情况。如果代码未执行,请在 charArray 的 int(ascii vals)上打印目录中的所有文件名 - 找到您要查找的文件名,并查看字符是如何编码的以及为什么它不相等。


答案 2

我对非ascii字符也有同样的看法,这帮助(更新):

String fileName = "file:///Users/dnelepov/Downloads/тест изображение.png"; 
URI uri = new URI(null, null, fileName, null); 
System.out.println("TS:" + uri.getPath);
System.out.println("EX:" + new File(uri).exists());