Java.io.filenotfoundexception用于具有西里尔字符的文件路径
我有一个文件,其名称不仅包含普通ASCII字符集的字符,还包含非ASCII字符集的字符。在我的例子中,它包含西里尔字母 以下是我的代码片段:Java.io.filenotfoundexception用于具有西里尔字符的文件路径,java,macos,filenotfoundexception,cyrillic,Java,Macos,Filenotfoundexception,Cyrillic,我有一个文件,其名称不仅包含普通ASCII字符集的字符,还包含非ASCII字符集的字符。在我的例子中,它包含西里尔字母 以下是我的代码片段: String fileName = "/Users/dnelepov/Downloads/тест изображение.png"; File sendFile = new File(fileName); if (sendFile.exists()) { // Some code } 如果未执行块,sendFile.中的代码存在 为什么文件不能
String fileName = "/Users/dnelepov/Downloads/тест изображение.png";
File sendFile = new File(fileName);
if (sendFile.exists()) {
// Some code
}
如果未执行块,sendFile.中的代码存在
为什么文件不能被识别
我的系统配置
区域设置
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上创建了这个项目,找到了这个文件。我检查了项目属性,找到了MacOS6JDK
然后我将其更改为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;
}
});
Path Path=Path.get(“/Users/dnelepov/Downloads/test/”;
walkFileTree(路径,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult visitFile(路径oneF,基本文件属性属性属性)引发IOException{
System.out.println(“文件:+oneF”);
if(Files.exists(oneF)){
System.out.println(“存在:+oneF”);
}
返回FileVisitResult.CONTINUE;
}
});
我对非ascii字符也有相同的设置,这有助于(更新):
当我在OSX 10.8.4中使用Java7B21时,下面的代码在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中修复的一个bug。我已经用以下字符替换了西里尔字符,并且似乎对我有效:
String fileName = "/Users/user1/тест \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.txt";
试一试只是为了好玩,这个技巧可能会奏效:
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 VAL)进行打印——找到您要查找的文件名,并查看字符是如何编码的以及为什么不相等 我想这是Mac OS X?是的,它快把我累死了:(我不喜欢这些)�" 符号。您是否检查了终端的编码[是否可能,Mac OS X中的终端默认使用ISO 8859-5?请查看此处的流程图:]?您是否可以在终端中键入“locale”并向我们显示其输出(只是为了确保)?系统配置字符串文件名的更新问题=”/Users/dnelepov/Downloads/crmkСзжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж(null,null,yourPath,null)
而不是没有例外,但是文件对于Java仍然不可见问题在于空间,所以你可以用%20
替换它,或者你可以使用@fge的解决方案。我也会更新答案。Balint Bako,没有工作。这里更改路径:String fileName=”/Users/dnelepov/Downloads/СзжжжжжжжжжжжжжжжжжжжаOSX:Darwin Dmitrys-MacBook-Pro.local 11.4.2 Darwin内核版本11.4.2:Thu Aug 23 16:25:48 PDT 2012;root:xnu-1699.32.7~1/RELEASE_X86_64 X86_64*********************************************Java:Java版本“1.7.0_21”Java(TM)SE运行时环境(build 1.7.0_21-b12)build 64位热点服务器(build 64位混合模式)****************************地区:LANG=“ru_.UTF-8”LC_-COLLATE=“ru_-ru.UTF-8”LC_-CTYPE=“ru_.UTF-8”LC_-MESSAGES=“ru_.UTF-8”LC_-MONETARY=“ru.UTF-8”LC_NUMERIC=“ru_-ru.UTF-8”LC_-TIME=“ru_-ru.UTF-8”LC_-ALL=“ru_-ru.UTF-8”LC-8”也许您应该使用行为更可预测的虚拟机字符串/Users/dnelepov/Downloads/test/\u0442\u0435\u0441\u0442\u0020\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.png;System.out.println(“例如:“+新文件(文件名).exists())-result EX:false这似乎是一个很好的方法来检查它是否可以读取目录中所有文件的名称。对于每个文件,我都会将结果输出到错误日志中,您可以将该字符串与您使用的实际文件名进行比较,以找出差异。然后您将能够以某种方式处理此错误-我猜这是最终结果你会从用户交互中得到这个文件吗?如果不是,你能重命名这个文件吗?你能得到一个指向它在磁盘上的物理位置、大小等的指针,然后在内容中发出声音吗?或者这是不可能的,我在发自内心地说?
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
...
}