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"

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 -バージョン

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版ではありません。だから私の問題はまだ存在します。

このエラーを表示するビデオを作成しました エラーのある ビデオ

更新 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 に答える