2014-01-09 140 views
2

我在我的應用程序中有以下代碼塊;Thread.currentThread()。getContextClassLoader()。getResourceAsStream()返回null

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(FilePath); 

這裏'FilePath'是文件的絕對路徑。

上面的代碼在linux和windows下工作正常,當我以正常模式運行應用程序時(即:在命令提示符中) 但是,當我將應用程序作爲Windows服務運行時,這不起作用。我將輸入流視爲'null'。

之前有人遇到過這樣的問題嗎?除了java類加載器之外,我找不到任何關於此的信息。在這裏,我們使用「ContextClassLoader」,這是正確的類加載器使用..

任何線索?

+1

向我們展示您使用的確切路徑。在這種情況下,「絕對路徑」聽起來不對。 –

+0

這裏我的路徑就像存儲庫「+ File.separator +」資源「+ File.separator +」api_templates「+」api.xml「;(我已經在我的wrapper.conf文件中設置了主目錄,我的應用程序作爲服務啓動「repository目錄是我的主目錄中的第一個子目錄 – Ratha

+1

您確定您的應用程序運行的標識爲服務允許您嘗試打開的文件的讀取訪問權限嗎?如果它的身份證號碼正常運行,但不是作爲服務,那麼在我看來,唯一的區別是它是如何執行的,或者是由誰執行的。 – CodeChimp

回答

9

我想這是因爲你有「。」 (當前文件夾)在類路徑上。這是a)一個壞主意,b)讓你的應用程序以奇怪的方式破解。

你需要了解的是文件和資源的區別。一個文件是類路徑之外的東西。

您應該使用FileFileReader來訪問它們。

資源是類路徑上的東西。資源路徑始終使用/作爲文件分隔符,而不是File.separator

解決此問題的另一種方法是將$HOME/repository/(Linux)或%HOME%/repository/添加到類路徑並使用"resources/api_templates/api.xml"加載資源。爲此,resources必須是$HOME/repository/中的文件夾。

如果您不這樣做,那麼您的主目錄中的所有文件(或者恰好啓動應用程序的任何目錄)都將作爲資源添加到類路徑中。

+0

感謝您的詳細解答。現在更改爲FileInputStream。改變了我的代碼,如InputStream in = new FileInputStream(filePame);理解資源和文件的區別。我試圖讀取文件而不是資源。再次感謝 – Ratha

相關問題