我正在处理使用文件执行各种IO操作的代码,我想让它能够处理国际文件名.我正在使用Java 1.5处理Mac,如果文件名包含需要代理的Unicode字符,则JVM似乎无法找到该文件.例如,我的测试文件是:
"???.gif" 它被分解为Java字符 \u8349\uD85B\uDFF6\u9DD7\u5916.gif
如果我从这个文件名创建一个文件,我无法打开它,因为我得到一个FileNotFound异常.即使在包含该文件的文件夹上使用它也会失败:
File[] files = folder.listFiles();
for (File file : files) {
if (!file.exists()) {
System.out.println("Failed to find File"); //Fails on the surrogate filename
}
}
Run Code Online (Sandbox Code Playgroud)
我实际处理的大部分代码都是以下形式:
FileInputStream instream = new FileInputStream(new File("???.gif"));
// operations follow
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,要么转义文件名,要么以不同的方式打开文件?
如何打开一个具有Java拒绝打开的特殊字符的文件?
一开始我觉得这是一个字符集编码问题,因为我从日志文件中读取错误的文件名.但后来我发现,它可能是JVM的一个bug,我需要一个解决方法.
真实的例子比单词更好
import java.io.*;
public class WTF{
public static void main(String[] s)throws Exception{
File f2=new File(".");
for (File subFile : f2.listFiles()) {
System.out.println(subFile.getName());
System.out.println(subFile.exists());
System.out.println(new FileInputStream(subFile));
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果
[USER@SERVER ZZZ]$ java -cp . WTF
WTF.class
true
java.io.FileInputStream@732dacd1
WTF.java
true
java.io.FileInputStream@3bad086a
ABC_?%81DEF.txt
false
Exception in thread "main" java.io.FileNotFoundException: ABC_?%81DEF.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at WTF.main(WTF.java:8)
Run Code Online (Sandbox Code Playgroud)
并且文件夹包含
[USER@SERVER ZZZ]$ ls -lb
-rw-r--r-- 1 USER GROUP 8 Apr 14 20:54 ABC_\303%81DEF.txt
-rw-r--r-- …Run Code Online (Sandbox Code Playgroud)