Java java.io.filenotfoundexception для пути к файлу с кириллическими символами

У меня есть файл, имя которого содержит символы не только из простого набора символов 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)

UPDATE

Я обнаружил, что эта ошибка находится в JDK от Oracle.

Я создал проект на 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;
        }
    });

qaru.site/info/351530/...

Ответы

Ответ 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
          ...
    }

Я не знаю, принесет ли он вам какие-либо другие результаты, тем более что это может быть просто странная проблема с кодировкой с именем файла, но это может помочь пролить свет на ситуацию. Если код не выполняется, выполните печать в int (ascii vals) charArray для всех имен файлов в каталоге - найдите тот, который вы ищете, и посмотрите, как кодируются символы и почему это не равный.

Ответ 2

У меня было то же самое с символами non-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());

Ответ 3

Следующий код печатает true в OSX, когда я использую Java 7 b21 с OSX 10.8.4. Основываясь на вашей версии ядра, похоже, что вы используете 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.

Ответ 4

Я заменил кириллические символы эквиваленты unicode и, похоже, работает для меня:

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

Сделайте снимок