2012-09-06 46 views
3

其实我有下面的代码:如何阅读使用西里尔路径文件

String f = LauncherFrame.class.getProtectionDomain().getCodeSource().getLocation().getPath(); // path to launcher 
java.lang.System.out.println(f); 

String launcherHash = ""; 

try{ 
    MessageDigest md5 = MessageDigest.getInstance("MD5"); 
    launcherHash = calculateHash(md5, f); 
}catch (Exception e) { 
    java.lang.System.out.println(e){ 
    return; 
} 

calculateHash功能:

public static String calculateHash(MessageDigest algorithm,String fileName) throws Exception{ 
     FileInputStream fis = new FileInputStream(fileName); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     DigestInputStream dis = new DigestInputStream(bis, algorithm); 

     while (dis.read() != -1); 
      byte[] hash = algorithm.digest(); 

     return byteArray2Hex(hash); 
} 

它的工作好于UNIX/Windows的时候,我.jar文件都没有西里尔字符在路径中。但是当它有,我得到下一个例外:

java.io.FileNotFoundException: 
C:\Users\%d0%90%d1%80%d1%82%d1%83%d1%80\Documents\NetBeansProjects\artcraft-client\build\classes (Can't find file) 

我该如何解决它?

回答

2

这是来自内存,所以语法可能有点偏离,但最好的可能是使用内置的URL支持直接从URL打开流;

URL url = LauncherFrame.class.getProtectionDomain().getCodeSource().getLocation(); 

然后将URL传递给calculateHash而不是文件名,并使用URL's openStream method获得与内容流;

InputStream is = url.openStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 
...