2012-12-04 84 views
0

我有一個創建一個臨時的MP3文件,並把它放在一個目錄一樣C:\爪哇 - 從目錄中讀取文件的jar

File tempfile = File.createTempFile("something", ".mp3", new File("C:\\)); 

我能夠通過只使用同一tempfile讀它的應用程序再次。 在Eclipse IDE中一切正常。

但是,當我將項目導出爲Runnable jar時,我的文件仍在正確製作中(我可以使用iTunes等普通音樂播放器播放它們),但似乎無法在我的應用程序中閱讀它們。

我發現我需要使用類似getClass().getResource("/relative/path/in/jar.mp3")使用是在jar.資源文件,但是這似乎並沒有工作,如果我想在我的文件系統,選擇從某個位置的文件像C:\something.mp3

有人能幫我解決這個問題嗎?

回答

1

看來你沒有文件名稱的臨時文件。當你在eclipse中運行你的程序時,這個實例創建了一個處理文件,但是當你創建一個可運行的程序後,你不能夠在eclipse創建的那個文件中讀這個文件,你可運行的文件可以創建它自己的臨時文件並且可以處理它們, 爲了使臨時文件截止放在那裏(路徑+名稱)項中的一些數據庫或屬性文件

例如,你會從打擊代碼創建一個臨時文件

File tempfile = File.createTempFile("out", ".txt", new File("D:\\"));   
FileWriter fstream = new FileWriter(tempfile);//write in file 
out = new BufferedWriter(fstream); 

的出來會不會出.txt文件它將是

out6654748541383250156.txt // it mean a randum number will be append with file 

你在可運行jar中的代碼是無法找到這些臨時文件

0

getClass().getResource()只讀取類路徑中的資源。事實上,傳遞給getResource()的路徑是相對於當前類路徑中任何路徑的路徑。這聽起來有點令人困惑,所以我舉個例子:

如果你的類路徑包含一個目錄C:\development\resources,你可以使用getResource()加載這個目錄下的任何文件。例如,有一個文件C:\development\resources\mp3\song.mp3。你可以通過調用

getClass().getResource("mp3/song.mp3"); 

底線加載此文件:如果你想使用getResource()讀取文件,你需要這些文件是在類路徑中。

+0

好的,我應該然後把我的runnable jar在c:\ development(對於這個例子)? – dumazy

+0

不知道你正在試圖用這個應用程序來完成什麼,我不能提出任何建議。我只是在指出爲什麼你的例子不起作用。您應該將應用程序文件保存在jar中,可以運行或不運行,並且應該可以在文件系統的任何位置播放MP3。 – rmlan

0

對於來自特權的JAR文件和文件系統加載,我不得不使用兩種不同的機制:

  • getClass().getClassLoader().getResource(path),並且如果返回null,
  • new File(path).toURI().toURL();

你可以將其轉換爲ResourceResolver策略,該策略使用classpath方法和一個或多個文件方法(可能使用不同的基本路徑)。