2011-11-30 150 views
1

我正在使用一種方法爲研究項目動態生成XML文件,它們被放入一個從文件路徑讀取的加載器中,我沒有在加載器是如何處理事務的控制(否則我會傳球,而不是與臨時文件瞎搞內部XML表示),我使用這個代碼來保存文件:getClassLoader()。getResource(filepath)返回一個空指針

File outputs = File.createTempFile("lvlFile", ".tmp.xml"); 

FileWriter fw = new FileWriter(outputs); 

fw.write(el.asXML()); 

fw.close(); 

// filenames is my list of file paths which gets returned and passed around 

filenames.add(outputs.getAbsolutePath()); 

現在,我敢肯定,相關文件直接寫入。如果我打印outputs.getAbsolutePath()並通過終端瀏覽以檢查文件,則所有內容都會生成並正確寫入,因此文件系統中的所有內容都是正確的。然而,這段代碼:

URL url = this.getClass().getClassLoader().getResource(_levelFile); 

哪裏_levelFile高於生成的文件名我一個,使URL爲空。路徑沒有被損壞或者其他任何東西,打印驗證_levelFile指向正確的路徑。相同的代碼已成功爲其他文件。此外,該錯誤似乎與我是否使用getPath(),getCanonicalPath()或getAbsolutePath()有關,進一步設置outputs.isReadable(true)不會執行任何操作。

任何想法?請不要提供Url url =結構的替代方案,我無法控制此代碼*,我有義務更改我的代碼,以便正確設置網址。

(*)儘管當前代碼在所有其他情況下成功,但至少在沒有重大努力的情況下重寫了我正在使用的大部分框架。

編輯:

同樣,我不能使用替代URL代碼,這是我不能碰裝載機的一部分。另外,即使將臨時文件的路徑設置爲與我成功加載的文件相同的目錄,加載也會失敗。

+0

因爲要創建一個臨時文件,可以自動獲得後您刪除關閉該文件。你檢查了嗎? – Jomoos

回答

1

我假定ClassLoader只會查找類路徑中的資源 - 這可能不包括/tmp。我不確定它是否真的支持絕對路徑名。它可能只是將它們解釋爲相對於單個類路徑的根。

如何使用​​代替?

+0

你是對的絕對路徑。 getResource(anAbsolutePath)將從給定的類加載器的根開始。 並且/ tmp永遠不會在類路徑中,除非您手動將其放在那裏。 – JohnnyK

+0

無法使用toURI()。toURL(),我將該文件名傳遞給框架中的方法,並執行URL代碼,並且我無法修改該方法的參數或代碼。 – LinearZoetrope

0

您正在文件系統中創建文件,然後嘗試將其作爲資源讀取。資源是JVM獲取其類的地方,即類路徑。因此,只有在將文件寫入類路徑時,此操作纔有效。

即使這是正確的,也要小心:如果您正在從eclipse運行,那麼在刷新工作空間之前,您的進程不會「看到」新資源。

現在我的問題是:你真的確定你想讀取文件作爲資源。看來你應該創建新的FileInputStream(_levelFile)並從中讀取。

編輯

@Anonymouse是正確的。您正在使用2-arg版本createTempFile()創建臨時文件,因此您的文件將在臨時目錄中創建。它進入你的類路徑的可能性非常低......:) 所以,如果你想讀它,那麼你必須得到它的路徑或創建輸入流時只是用它:

File outputs = File.createTempFile("lvlFile", ".tmp.xml"); 
.......................... 
InputStream in = new FileInputStream(ouptuts); 
// now read from this stream. 
+0

不幸的是,我不能使用輸入流,我的手與URL代碼綁定,否則我已經這樣做了。另外,使用三個參數createTempFile來設置文件被寫入同一目錄的目錄,因爲我成功讀取的文件也來自同一個目錄。 – LinearZoetrope