天天看點

java web 通路本地檔案_JavaBean通路本地檔案實作路徑無關

在JSP中,頁面連結是使用web路徑的,但如果JavaBean要通路本地檔案讀取配置資訊的話,是需要檔案的本地路徑的。如果你在寫Bean的時候直接将本地路徑寫進去,那網站的路徑就不能變化,喪失可移植性。也許有人說可以将路徑寫入配置檔案中,我是新手,不清楚配置檔案的讀取機制。在網上搜尋的時候,發現很多新手也有同樣的問題,Bean通路本地檔案需要本地的絕對路徑。下面就提供一個比較笨的方法,實作網站檔案讀取的路徑無關,如果各位技術屆大佬有好的方法和技術的話,回帖裡給我們這些新手點幫助,小第在此謝過。

本人剛剛大學畢業,畢業設計是用JSP來做的一個項目,該項目中需要通路本地的一些檔案,我們當然可以直接寫絕對路徑,但答辯調試的話,如果web伺服器安裝的路徑和你的不一樣的話,就不可能調試成功,動手改程式就顯得太低能了。是以,要做到路徑無關,把整個網站檔案夾拷到web伺服器目錄中就能直接運作才是硬道理。廢話少說,切入正題。

JSP網站中,配置檔案,JavaBean,其它檔案,都是存儲在WEB-INF檔案夾中的。

我們可以将擷取檔案父目錄的代碼放到構造函數裡,這樣在執行個體化類的時候就擷取了檔案父目錄的路徑,需要通路檔案時,就可以直接在該路徑後面加上檔案的相對路徑。

1.  擷取目前類編譯後的檔案名(xxxxx.class)

首先用getClass()方法擷取該類的類型,然後調用getName()方法擷取類名。如果你的類名叫MyClass,該類屬于bean包,那麼this.getClass().getName()的結果就是bean.MyClass。而這個類編譯後,應該叫MyClass.class,是以,我們必須剪掉包名和那個點。這時需要用到getPackage()擷取包類型,然後用getName()擷取包名。這樣就是:

this.getClass().getPackage().getName().然後用String的subString()方法就可以獲得檔案名了。

String className = this.getClass().getName();

String packageName = this.getClass().getPackage().getName();

String classFileName = className.subString(packageName.length()+1)+".class";

這3行代碼下來,就取得了類的檔案名:MyClass.class

2.  接下來是擷取該類檔案的路徑

這裡要用到getResource()方法,該方法是擷取類檔案的路徑。該方法傳回的是URI類型的,我們要轉化成String類型,結果為“file:///D:/TomCat/......”格式的。

String classFilePath = this.getClass().getResource(classFileName).toString();

3.  最後擷取父目錄的路徑

前面已經說了,我們的檔案一般是放在WEB-INF檔案夾下的,而JavaBean的類檔案放在WEB-INF/classes/下,而我們的classFilePath的結果為file:///D:/.../WEB-INF/classes/bean/MyClass.class,我們需要把WEB-INF後面的内容去掉,同樣用subString()方法。

String filePath = classFilePath.subString(0,classFilePath.length()-className.length()-14));

className的值是bean.MyClass,"classes/"+".class"共14個字元,這條語句下來,就是父目錄的路徑了,結果為"file:///D:/.../WEB-INF/"。這個目錄不能直接拿來用,結果也是windows上的路徑,在UNIX,LINUX中就不同了,照顧到平台無關性,我們需要這樣做:

URI uri = URI(filePath+"檔案相對路徑");

File file1 = File(uri);

好了,這樣就做到了路徑無關,把代碼整理放下面,友善檢視。同時也請各位高手不吝賜教哈。

String className = this.getClass().getName();

String packageName = this.getClass().getPackage().getName();

String classFileName = className.subString(packageName.length()+1)+".class";

String classFilePath = this.getClass().getResource(classFileName).toString();

String filePath = classFilePath.subString(0,classFilePath.length()-className.length()-14));

filePath為父目錄,用的時候filePath+"相對路徑"+"檔案名".