2012-09-15 36 views
2

我想要訪問我已經包含在jar中的文件。FileNotFoundException當使用FileInputStream

我的代碼開頭如下:

import java.io.*; 
import java.net.*; 

public class intro { 
public static void main(String[] args) throws IOException{ 

    URL jarUrl = intro.class.getResource("myFile.jar"); 
    File myJar = new File(jarUrl.toString()); 

    FileInputStream fis = new FileInputStream(myjar); 
} 

,我發現了以下錯誤:

Exception in thread "main" java.io.FileNotFoundException: file:\...myFile.jar (The filename, directory name, or volume label syntax is incorrect) 
at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(Unknown Source) 
at intro.main(intro.java:10) 

它似乎已經沒有問題,找到的網址或初始化文件,但我無法使FileInputStream正常工作。有人知道我在做什麼錯嗎?幫助將不勝感激。

回答

3

你不能以這種方式訪問​​Jar'ed資源。 Jar中的文件不是File(即在文件系統文件中),它們是不同的概念。

您應該改用URL.openStream

InputStream is = null; 
try { 
    is = jarURL.openStream(); 
    // ... Read from stream 
} catch (IOException exp) { 
} finally { 
    try { 
     if (is != null) { 
     is.close(); 
     } 
    } catch (Exception exp) { 
    }  
} 
+0

@HovercraftFullOfEels(這是其他原因而關閉語句是一個try-catch;)) – MadProgrammer

+0

啊,OK,我們對此深感抱歉。 –

+0

@HovercraftFullOfEels沒有probs,你的更正更正確,我只是懶惰;) – MadProgrammer

1

你的做法是對的多個層面的不正確的:

  1. 這是錯誤的,因爲一個URL不是一個文件名:

    File myJar = new File(jarUrl.toString()); 
    

    假設jarUrl具有類型java.net.URL ,應該寫成:

    File myJar = new File(new URI(jarUrl)); 
    
  2. 這是錯誤的,因爲它會(假設myJar是正確的),打開JAR文件的字節流:

    FileInputStream fis = new FileInputStream(myJar); 
    

    事實上,你需要使用JAR/ZIP文件中的類來打開它,然後用他們在JAR包含的文件上打開一個流。它應該是這樣的:

    ZipFile zip = new ZipFile(myJar); 
    ZipEntry entry = zip.getEntry(filePathInZip); 
    InputStream is = entry.getInputStream(); 
    

    (我省略了所有必要的異常處理和代碼,收東西,以防止資源泄漏。)

  3. 這看起來錯誤的URL:

    file:\...myFile.jar 
    

    什麼是反斜槓和三個點?格式良好的網址不會使用\

1

如果這是一個已知的資源,你可以使用:當他們說你這樣做是錯誤的

InputStream is =intro.class.getResourceAsStream("myFile.jar"); 

其他的答案正在一些假設。但它是懷疑你正試圖獲得一個第一罐作爲一種資源,然後再爲文件...

而且,看到這一點:getResourceAsStream() vs FileInputStream

0

我不會拐彎抹角,和將立即去點...你不能以這種方式訪問​​jar裏面的文件......而是嘗試下面的..

URL jarUrl = intro.class.getResource("myFile.jar"); 
InputStream is = null; 
String s = new String(); 

try { 
     is = jarURL.openStream(); 
     Scanner scan = new Scanner(is); 

     while(scan.hasNextLine){ 

     s = scan.nextLine() + s; 

    } 

    } catch (IOException exp) { 
} finally { 

     is.close(); 
     } 
相關問題