2014-06-07 29 views
0

我有一個名爲sysconfig.properties的屬性文件,我想多次讀取它,因爲它是可變的。但是當我改變所述sysconfig.properties的內容,那麼我讀即imutable,這與第一次從systemconfig.properties讀取同一內容的sysconfig.propertes的銼的內容文件如下:Thread.currentThread()。getContextClassLoader()。getResourceAsStream多次讀取屬性文件

isInitSuccess=TRUE 
isStartValid=2013 

可能有時會發生如下變化:

isInitSuccess=FALSE 
isStartValid=2013 

讀屬性文件的代碼如下:

InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);  

我使用的代碼讀取文件mutilple次,但每一次的「isInitSuccess」是「真」,雖然我改變了isInitSuccess = FALSE.Is系統只讀了一次,然後我讀取文件,它只是從內存中獲取輸入流? 但是當我使用下面的代碼,這將很好地工作:

InputStream inStream = new FileInputStream(new File(strPath)); 

我GOOGLE了,但我沒有發現任何幫助,這個問題困惑了我很多,任何幫助將升值。

回答

2

您需要了解類路徑是什麼。

簡而言之,Java有一個類路徑的概念,它包括它需要運行的所有資源(.class文件,.properties文件,以及其他任何東西)。當您使用ClassLoader#getResourceAsStream(String)時,您實際上獲得了類路徑資源的InputStream。該資源可以是磁盤上的物理資源,也可以位於存檔中。

當您使用FileInputStream時,您會得到磁盤上文件的InputStream

來自ClassLoaderInputStream和來自FileInputStream的那個不對應於相同的文件。

您應該瞭解您的IDE(或任何構建系統)如何處理您的文件。

+0

非常感謝,你告訴了我很多關於classpath的知識(我是java開發人員的綠色之手)。「ClassLoader中的InputStream和FileInputStream中的InputStream不對應同一個文件。」這是正確的。但在我的具體情況下,它們對應於同一個文件。可能有一些文件在我的claspath中都被稱爲sysconfig.properties文件,但文件內容必須相同。內容爲: isInitSuccess = TRUE isStartValid = 2013 但是,當我更改內容如下: isInitSuccess = TRUE ************* isStartValid = 2013 ************** –

+0

然後我停止了程序並重新啓動它,來自ClassLoader的InputStream和從FileInputStream讀取的內容都是相同的,所以我可以保證他們讀取同一個文件。 –