分成普通java類和servlet類 兩種情況考慮讀取資源文件
要點說明:
1:在javaweb項目中所有src下的資源在部署後都會被弄到WEB-INF/classes/下
2:this.getServletContext().getRealPath("/");來的得到當前web應用在硬盤上的絕對路徑
3:FileInputStream in = new FileInputStream("資源名");//如果這裏用的是相對路徑,那麼這裏是相對於服務器的虛擬機而言的。例如tomcat的/bin
4:採用類加載方式的相對路徑是classpath,可以使用../獲取上一路徑。
具體說明:
在servlet中:
1:當資源在src下時:
InputStream in = this.getServletContext().getResourceAsStream(“/WEB-INF/classes/資源名”);
2:當資源在項目根目錄下的時候:InputStream in = this.getServletContext().getResourceAsStream(“/資源名”);
3:在考慮1、2的前提下,可以通過:
String path = this.getServletContext().getRealPath("/");//得到當前應用在服務器的絕對路徑
FileInputStream in = new FileInputStream(path+"/資源名");//此時讀取的是資源的絕對路徑
在普通的java類中:
說明:其實我們可以通過傳遞ServletContext對象,然後讀取資源如上,但是考慮到要降低對象之間的耦合性,所以不採取此種方法。
解決方法(採用類加載器):
1:類名.class.getClassLoader().getResourceAsStream("資源名");//放在src下,看要點說明第4點。此種方法存在一個缺點:在第二次調用方法讀取資源之前若資源內容發生變化,第二次讀取的內容仍然是第一次讀取的內容,因爲類加載器發現時同一個類,所以直接返回原來的資源。
2:String path = 類名.class.getClassLoader().getResource("資源名").getPath();//通過URI形式
FileInputStream in = new FileInputStream(path);
提示:在路徑中獲取資源名稱:String name = path.substring(path.lastIndexOf("\\")+1);
參考建議:方立勳的javaweb視頻
可以參考的相關鏈接:http://blog.csdn.net/origin100/article/details/5808234