javaweb有兩種方式讀取資源文件
在Servlet中讀取,可以使用servletContext,servletContext可以拿到web所有的資源文件,然后隨便讀,但是這種方法不常用,盡量少在Servlet中讀取資源文件
在普通Java類中(DAO中),使用類加載器來讀 和 絕對路徑來讀取
類裝載器可以訪問的范圍是classes文件夾下的文件
src文件夾下面的文件在發布之后都會在classes文件夾下,也就是整個類加載器,都可以通過類加載器來操作
1. 使用servletContext
軟件開發中,用作資源文件(配置文件)的文件類型有兩種:xml文件和properties文件
比如新建一個properties文件,用作數據庫的配置
url=jdbc\:mysql\://localhost\:3006/test username=test password=123
然后在Servlet中讀取文件
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStream instream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.propertites"); Properties pro = new Properties(); //map pro.load(instream); String url = pro.getProperty("url"); String username = pro.getProperty("username"); System.out.println(url); System.out.println(username); }
其中路徑不能寫成"/src/db.propertites", / 表示當前web程序
因為最終讀取的是發布在服務器中的文件。都是在classes文件夾下面
對於properties文件的操作都可以使用properties這個類
這個類是把文件中的數據以map形式存儲,
有幾行就會有幾個元素
注意:
我們在寫Java的時候常用下面這種方式讀取文件,但是在javaweb中是不行的
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FileInputStream instream = new FileInputStream("/WEB-INF/classes/db.propertites"); Properties pro = new Properties(); //map pro.load(instream); String url = pro.getProperty("url"); String username = pro.getProperty("username"); System.out.println(url); System.out.println(username); }
FileInputStream instream = new FileInputStream("/WEB-INF/classes/db.propertites");
考慮清楚這個相對路徑是相對誰的。
這句話是由服務器來調用,服務器由Java虛擬機來運行,所以這個是相對Java虛擬機的啟動目錄
Java虛擬機的目錄是?
我們啟動服務器都是在C:\tomcat\bin目錄下的startup.bat,啟動的時候同時啟動虛擬機
所以是相對的是這個目錄。。
所以,在javaweb中讀取文件,用Servlet不能使用這種方式,這種方式必須把文件放在Java虛擬機目錄下
傳統方式也不是不可行,必須要知道文件的絕對路徑
使用servletContext先得到文件在磁盤的絕對路徑。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.propertites") FileInputStream instream = new FileInputStream(path); Properties pro = new Properties(); //map pro.load(instream); String url = pro.getProperty("url"); String username = pro.getProperty("username"); System.out.println(url); System.out.println(username); }
這中方式可以得到該文件的名稱。
因為有時間文件名稱是客戶機傳過來的,開發者需要知道
就需要截取path字符串了。
path.substring(path.lastIndexOf("\\") +1)
2. 使用類裝載器
對數據庫配置文件的讀取,一般是不放在servlet中的,一般是放在DAO類中
這樣才能把web層和數據層分開來
類裝載器:
Java虛擬機使用每一個類的第一件事情就是將該類的字節碼裝載近來,裝載類字節碼的功能是由類裝載器完成的,類裝載器負責根據一個類的名稱來定位和生成類的字節碼數據后返回給Java虛擬機。最常見的類裝載器是將要加載的類名轉換成一個.class文件名,然后從文件系統中找到該文件並讀取其中的內容,這種類裝載器也不是直接將.class文件中的內容原封不動地返回給Java虛擬機,它需要將.class文件中的內容轉換成Java虛擬機使用的類字節碼。不管類裝載器采用什么方式,只要能夠在內存中制造出給Java虛擬機調用類字節碼即可,所以把類裝載器描述為類字節碼的制造器更容易讓人理解。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { userDAO dao= new userDAO(); dao.update(); }
public class userDAO { public void update() throws IOException { InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites"); Properties pro = new Properties(); //map pro.load(instream); String url = pro.getProperty("url"); String username = pro.getProperty("username"); System.out.println(url); System.out.println(username); } }
其中userDAO.class.getClassLoader
得到類裝載器
因為他們都是在Classes文件夾下面,所以可以訪問到該文件
由於對數據庫的操作方法有很多,不能每個方法里面都寫這種,所以可以使用靜態代碼塊的方式。
public class userDAO { private static Properties dbconfig =new Properties(); static{ try { InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites"); dbconfig.load(instream); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } public void update() throws IOException { System.out.println(dbconfig.getProperty("url")); } public void find() throws IOException { } public void delete() throws IOException { } }
使用類裝載器讀取文件的弊端:
1.文件不能太大,因為它是以裝載類的方式一次性加入內存中
2.類裝載器只會加載一次,就是說不能顯示文件的更新操作
3.使用絕對路徑讀取
如果需要讀到實時數據,就不能通過類裝載器來讀文件,需要通過普通的文件路徑的方式
還是要通過類裝載的方式來得到文件的位置
public class DAO { public void update() throws IOException{ String path = DAO.class.getClassLoader().getResource("db.properties").getPath(); FileInputStream in= new FileInputStream(path); Properties pros = new Properties(); pros.load(in); String url = pros.getProperty("url"); } }