精華區beta java 關於我們 聯絡資訊
問題描述:包成 jar 後,讀取 jar 中的 .gif 和 .txt 的問題 嗯…該怎麼說呢,有點不太會表答…我的目錄結構如下: c:\java\ |-----images\1.gif |-----images\1.txt |--readfile.class 這個 readfile 是一個 JFrame,裡面有只有一個 JLabel,label上面顯示 1.gif 然後用 System.out.println() 印出 1.txt 的內容,以上是我的環境。 在我包成 jar 前可以執行,但是我包成 jar 後,卻讀不到1.txt了 但 1.gif 可以正常顯示,我看網路上有些教學說到,要讀 jar 中的檔,要用 ClassLoader cl = this.getClass().getClassLoader(); cl.getResource() 的方式 <返回值是 URL>,以下是我 JLabel 和 File 的創造方式: Icon saveIcon = new ImageIcon(cl.getResource("images/01.jpg")); lbl = new JLabel(saveIcon); File f = new File(cl.getResource("images/01.txt").toURI()); //因為 File 的建構子要接的是 URI,所以用 toURI() 轉了一次。 在包成 jar 前,此程式可以正常執行,結果也沒錯!但是包成 jar 後,卻出現以下的 錯誤訊息,該怎麼讓他正常顯示呢? 錯誤訊息: Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical at java.io.File.<init>(Unknown Source) at readfile.<init>(readfile.java:17) at readfile.main(readfile.java:36) 程式碼: //試一下版大的轉換程式 // 1.gif 和 1.txt 就不附上了^^ //也順便用一下版大最愛的 "7選項" import java.io.*; import java.net.*; import javax.swing.*; public class readfile extends JFrame{ JLabel lbl; String content=""; public readfile() { super("test"); setSize(400,300); ClassLoader cl = this.getClass().getClassLoader(); // Create icons try{ Icon saveIcon = new ImageIcon(cl.getResource("images/01.jpg")); File f = new File(cl.getResource("images/01.txt").toURI()); //line 17 BufferedReader br = new BufferedReader(new FileReader(f)); System.out.println(br.readLine()); lbl = new JLabel(saveIcon); lbl.setBounds(300,300,50,50); add(lbl); lbl.setText(content); show(); }catch(URISyntaxException e){ e.printStackTrace(); }catch(IOException ee){ ee.printStackTrace(); } } public static void main(String args[]) { readfile r =new readfile(); //line36 } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.145.131 ※ 編輯: Nt1 來自: 220.135.145.131 (02/08 03:48)
PsMonkey:[泣] 感謝使用我提供的功能 T___T 02/08 14:21
> -------------------------------------------------------------------------- < 作者: Nt1 (用功點吧!) 看板: java 標題: Re: [蟲?] ClassLoader 和 讀取 jar 中的檔案的問題 時間: Wed Feb 8 06:12:48 2006 ※ 引述《Nt1 (用功點吧!)》之銘言: 好吧…我剛剛在 javaworld 找到解決方法了,就…自問自答一下吧@@" 因為在 jar 中的檔案,(如txt),並沒有辦法建構出一個 File 物件來操作, 也就是說,不管用什麼方式,只要這個 txt file 在 jar 中,就沒有辨法用 File = new File(xxxxx); 的方式來產生,這時候…可以用 ClassLoader 中的 getResourceAsStream("filename") 來把這個txt file當成一個 stream 來處理,而不是 File物件,再用 InputStreamReader 來接這個 stream 就可以了^^ 如: ClassLoader cl = this.getClass().getClassLoader(); InputStreamReader inr = new InputStreamReader (cl.getResourceAsStream("images/01.txt")); BufferedReader br = new BufferedReader(inr); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.145.131