2012-06-28 115 views
15

我有以下路徑結構主類:如何從Class文件夾外部讀取java中的屬性文件?

D:/java/myapp/src/manClass.java 

,我希望把性質

D:/java/myapp/config.properties 

其中將包含一個文件名和一些其他的配置文件。我會設置文件名屬性文件中是這樣的:file=file_to_read.txt

file_to_read.txt將位於D:/java/myapp/folder_of_file/

主類將讀取的文件名從屬性文件,然後再獲得內容形成文件。

我可以做到這一點,如果config.propertiesfile_to_read.txtsrc/mainClass.java。但是我不能以我想要的方式取得成功。

有人可以幫我嗎?我需要你的建議,如果我想將myapp文件夾放在我的驅動器中的任何位置,並具有與上述相同的內部結構,並且程序能夠正確完成這項工作,我該怎麼辦。

我還需要你的建議,如果我想從構建項目後創建的jar中完成這項工作,那麼我可以沒有任何問題嗎?

我試着爲以下剛讀屬性文件:

 URL location = myClass.class.getProtectionDomain().getCodeSource().getLocation(); 

     String filePath = location.getPath().substring(1,location.getPath().length()); 

     InputStream in = myClass.class.getResourceAsStream(filePath + "config.properties"); 
     prop.load(in); 

     in.close(); 

     System.out.println(prop.getProperty("file")); 

但是這給當試圖從的getProperty屬性文件犯錯。 謝謝!

回答

0

您可以將配置文件目錄添加到運行時類路徑中,然後您可以使用Class.getResourceAsStream()來訪問它。

28

如何讀取性能在Java文件從類文件夾之外?

使用帶固定磁盤文件系統路徑的FileInputStream

InputStream input = new FileInputStream("D:/java/myapp/config.properties"); 

好多少,只是將其移動到由類路徑覆蓋,而不是現有的路徑之一,或到其原始路徑D:/java/myapp/添加到類路徑。然後,你可以按如下得到它:

InputStream input = getClass().getResourceAsStream("/config.properties"); 

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"); 
+1

是,使用BalusC的首選解決方案。 – Klinetel

+0

謝謝,它爲我工作。但是,我需要添加評論。如果你的文件夾添加到類路徑,那麼你並不需要指定獲取資源作爲流時的文件夾,這意味着你只需要調用的getResourceAsStream(「/ config.properties」),即使該文件位於一個名爲文件夾中資源 –

+1

@Jesus:是的,它默認使用文件夾內容的方式與已經在(默認)類路徑中的所有其他文件夾相同。 – BalusC

6

感謝大家對你的建議。我已經這樣做的工作:

 Properties prop = new Properties(); 
     String dir = System.getProperty("user.dir"); 
     InputStream in = new FileInputStream(dir + "/myapp/config.properties"); 
     prop.load(in); 
     in.close(); 
     String filePath = dir + "/myapp/folder_of_file/" + prop.getProperty("file"); /*file contains the file name to read*/ 
+1

這不是真正的便攜式,或者您應該在應用程序的安裝指南中非常清楚地記錄這一點。只需放入類路徑或將其路徑添加到類路徑就簡單多了。 – BalusC

+0

@BalusC,如果我想在運行時編輯屬性文件,該怎麼辦? – gdrt

0

你需要指定絕對路徑,但你不應該硬編碼的,這將使它更難開發和生產環境等之間切換..

您可以從系統屬性中獲取文件的基本路徑,您可以在代碼中使用System.getProperty(「basePath」)訪問該屬性,並且應該將其添加到文件名以創建絕對路徑。

在運行應用程序,你可以按如下方式指定在java命令行的路徑:

java -DbasePath="https://stackoverflow.com/a/b/c" ... 

...表示當前參數到Java命令來運行程序。

2
Properties property=new Properties(); 
property.load(new FileInputStream("C:/java/myapp/config.properties")); 
相關問題