17

我有一个文件,其名称不仅包含来自纯 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"

unname -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版本

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,并且再次找不到文件。

我的问题是我需要将 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

4

4 回答 4

5

只是为了好玩,这个黑客可能会奏效:

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) 上打印目录中所有文件名 - 找到您要查找的文件并查看字符的编码方式及其原因不相等。

于 2013-06-13T15:53:27.163 回答
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());
于 2013-06-06T17:23:05.010 回答
2

当我将 Java 7 b21 与 OSX 10.8.4 一起使用时,以下代码在 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 中修复的错误。

于 2013-06-08T17:07:41.680 回答
2

我已经用unicode 等价物替换了西里尔字符,它似乎对我有用:

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

试一试

于 2013-06-09T15:12:05.637 回答