2011-04-26 59 views
0

我要加載的資源與此:如果設置爲任何目錄,我可以從classpath加載資源嗎?

InputStream iStream = Config.class.getResourceAsStream("autopublisherpath.cfg"); 

所以我設置CLASSPATH,使其工作。這是我的目錄層次結構:

- autopublisher 
    .classes 
    .lib 
    .resources 

如果我添加%AUTOPUBLISHER_HOME%\資源\ CONFIG我的classpath中我不能得到的資源。否則,如果我將我的.cfg文件放在類中並添加%AUTOPUBLISHER_HOME%\ classes,資源已正確加載。類dir不包含autopublisherpath.cfg以外的任何內容。

最後,我想打電話:

的Java com.test.Something

地方在哪裏加載資源。事情是我想讓用戶修改這個配置文件,所以我沒有把它包含在我的jar包中。

我沒有正確理解CLASSPATH嗎?

謝謝

回答

3

有一點要注意在使用getResourceAsStream是您檢索資源名稱的格式。默認情況下,如果您未指定路徑(例如「autopublisherpath.cfg」),則類加載器會預期指定的資源與您在其上執行getResourcesAsStream方法的類所在的包相同。這樣做的原因行爲可以在JVM文檔中找到用於getResourceAsStream

  • 如果名字用「/」(「\ u002f」)開始,然後是資源的絕對名稱是名稱的部跟着'/'。
  • 否則,絕對名具有以下形式的:modified_package_name/name

在你的具體的例子,如果Config類是設在com.test.config包,然後在「autopublisherpath.cfg的資源名稱「將被轉換爲」/com/test/config/autopublisherpath.cfg「(包中的句點被替換爲」/「字符)。其結果是,與原有項目的層次結構保持一致,你就需要將文件放入位置:

autopublisher/resources/config/com/test/config 

其中autopublisher/resources/config加入作爲應用程序的執行類路徑的一部分。

如果您正在尋找將特定配置目錄添加到您的類路徑並希望該文件位於該目錄的根目錄中,那麼您需要在文件的名稱前加一個「/」字符,該字符指定該資源應該位於類路徑的根包中。

InputStream iStream = Config.class.getResourceAsStream("/autopublisherpath.cfg"); 

使用此代碼,你應該能夠在resource/config目錄添加到您的類路徑和讀取文件的預期。

在附註上,getResourceAsStream方法使用從其執行的類的類加載器(在此情況下爲Config)加載資源。除非您的應用程序使用多個類加載器,否則您可以使用從任何類實例執行相同的功能。

相關問題