带有西里尔字符的文件路径的Java java.io.filenotfoundexception

Dmi*_*pov 15 java macos filenotfoundexception cyrillic

我有一个文件,其名称不仅包含普通ASCII字符集中的字符,还包含非ASCII字符集中的字符.就我而言,它包含西里尔字符.

这是我的代码片段:

String fileName = "/Users/dnelepov/Downloads/???? ???????????.png";
File sendFile = new File(fileName);
if (sendFile.exists()) {
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

sendFile.exists if块中的代码未被执行.

为什么不识别文件?

我的系统配置 区域设置

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

UPDATE

我发现这个错误来自Oracle的JDK.

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

然后我将其更改为JDK 7并且文件未再次找到.

我的问题是我需要在JavaFX中使用JDK 7.不是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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

/sf/answers/1223684311/

Eri*_*ich 5

只是为了踢球,这个 hack 可能有效:

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
          ...
    }
Run Code Online (Sandbox Code Playgroud)

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


Bal*_*ako 2

我对非 ASCII 字符也有同样的情况,这有帮助(已更新):

\n\n
String fileName = "file:///Users/dnelepov/Downloads/\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 \xd0\xb8\xd0\xb7\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5.png"; \nURI uri = new URI(null, null, fileName, null); \nSystem.out.println("TS:" + uri.getPath);\nSystem.out.println("EX:" + new File(uri).exists());\n
Run Code Online (Sandbox Code Playgroud)\n