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

时间:2013-06-06 17:19:41

标签: java macos filenotfoundexception cyrillic

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

以下是我的代码片段:

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

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"

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)

更新

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

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

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

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

我制作了一个视频来显示此错误 Video with error

更新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

4 个答案:

答案 0 :(得分:4)

只是为了踢,这个黑客可能有效:

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)打印目录中的所有文件名 - 找到你要查找的那个,看看字符是怎么回事编码以及它为何不相等。

答案 1 :(得分: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());

答案 2 :(得分:2)

当我使用带有OSX 10.8.4的Java 7 b21时,以下代码在OSX上打印为true。根据您的内核版本,您看起来使用的是10.7。

import java.io.File;

public class file {
    public static void main(String[] args) {
        File file = new File("/Users/jhawk28/Developer/filetest/тест изображение.txt");
        System.out.println(file.exists());
    }
}

根据您所包含的项目,这是我机器上的输出:

java -jar TestCyrilic.jar 
EX:true

看起来它是在OSX 10.8中修复的错误。

答案 3 :(得分:2)

我用unicode equivalents替换了西里尔字符,它似乎对我有用:

String fileName = "/Users/user1/тест \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.txt";

试一试