2013-01-06 58 views
0

我需要從我的罐子裏訪問一個配置文件,所以我用:轉換一個jar文件URI到文件

URL configUrl = Object.class.getResource("/config.xml"); 

現在我需要的URL轉換成文件對象,因爲那是什麼下游需要ConfigurationFile對象進行初始化。當我試試這個:

new File(configUrl.toURI()) 

我得到:

java.lang.IllegalArgumentException: URI is not hierarchical 

當我試試這個:

new File(Thread.currentThread().getContextClassLoader().getResource("config.xml").getFile()) 

我得到:

File does not exist: 'file:\E:\Apps\jarfile.jar!\config.xml' 

注意:不幸的是我必須有一個File對象,在InputStream上。

+0

http://stackoverflow.com/questions/8495069/error-error-java-lang-illegalargumentexception-uri-is-not-hierarchical-whil – ShaggyInjun

+0

閱讀本...問題是,我必須有一個File對象--Configuration構造函數不會接受InputStream。 –

+1

@ErelSegalHalevi那你的運氣了,除非你改變你的方式分配資源。 – EJP

回答

2

如果文件是JAR的內...您可以使用的getResourceAsStream(),並直接或通過URL讀...

URL urlConfig = Object.class.getResource(CONFIG_FILE); 
if (urlConfig == null) { 
    // throw <error> 
} 
URLConnection connConfig = urlConfig.openConnection(); 
InputStream isConfig = connConfig.getInputStream(); // do things 

保存內容到時間文件...(等待1秒.. 。MMM)

public static File doThing(InputStream is) throws IOException { 
    File tmp = null; 
    FileOutputStream tmpOs = null; 
    try { 
     tmp = File.createTempFile("xml", "tmp"); 
     tmpOs = new FileOutputStream(tmp); 
     int len = -1; 
     byte[] b = new byte[4096]; 
     while ((len = is.read(b)) != -1) { 
      tmpOs.write(b, 0, len); 
     } 
    } finally { 
     try { is.close(); } catch (Exception e) {} 
     try { tmpOs.close(); } catch (Exception e) {} 
    } 
    return tmp; 
} 
+0

謝謝,這是一個很好的解決方法。 –

-2

你有沒有嘗試過這樣的:

 
File f; 
try { 
    f = new File(url.toURI()); 
} catch(URISyntaxException e) { 
    f = new File(url.getPath()); 
} 
+3

這隻有在資源真的是文件時纔有效。如果它在JAR文件中,則它不是文件。 – EJP

+1

是的,在第三行(withURI),我得到了同樣的錯誤:「線程中的異常」main「java.lang.IllegalArgumentException:URI不是分層的......在java.io.File。(Unknown Source)」 –

1

你的問題就沒有意義了。資源可能是一個JAR文件中,並在JAR文件的項目根本就不是一個文件,或File.

時期。

如果你需要一個File對象,你將不得不從JAR文件單獨分發的項目。