在javaweb中通过servlet类和普通类读取资源文件
javaweb有兩種方式讀取資源文件
在Servlet中讀取,可以使用servletContext,servletContext可以拿到web所有的資源文件,然后隨便讀,但是這種方法不常用,盡量少在Servlet中讀取資源文件
在普通Java類中(DAO中),使用類加載器來讀 ?和 絕對路徑來讀取
? ? ? 類裝載器可以訪問的范圍是classes文件夾下的文件
?
src文件夾下面的文件在發(fā)布之后都會在classes文件夾下,也就是整個類加載器,都可以通過類加載器來操作
?
?
1. 使用servletContext
?
軟件開發(fā)中,用作資源文件(配置文件)的文件類型有兩種:xml文件和properties文件?
比如新建一個properties文件,用作數(shù)據(jù)庫的配置
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程序
因為最終讀取的是發(fā)布在服務器中的文件。都是在classes文件夾下面
?
對于properties文件的操作都可以使用properties這個類
這個類是把文件中的數(shù)據(jù)以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");考慮清楚這個相對路徑是相對誰的。
這句話是由服務器來調(diào)用,服務器由Java虛擬機來運行,所以這個是相對Java虛擬機的啟動目錄
Java虛擬機的目錄是?
?
我們啟動服務器都是在C:\tomcat\bin目錄下的startup.bat,啟動的時候同時啟動虛擬機
所以是相對的是這個目錄。。
?
所以,在javaweb中讀取文件,用Servlet不能使用這種方式,這種方式必須把文件放在Java虛擬機目錄下
?
傳統(tǒng)方式也不是不可行,必須要知道文件的絕對路徑?
使用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);}?
這中方式可以得到該文件的名稱。
因為有時間文件名稱是客戶機傳過來的,開發(fā)者需要知道
就需要截取path字符串了。
path.substring(path.lastIndexOf("\\") +1)
?
?2. 使用類裝載器
對數(shù)據(jù)庫配置文件的讀取,一般是不放在servlet中的,一般是放在DAO類中
這樣才能把web層和數(shù)據(jù)層分開來
?
類裝載器:
Java虛擬機使用每一個類的第一件事情就是將該類的字節(jié)碼裝載近來,裝載類字節(jié)碼的功能是由類裝載器完成的,類裝載器負責根據(jù)一個類的名稱來定位和生成類的字節(jié)碼數(shù)據(jù)后返回給Java虛擬機。最常見的類裝載器是將要加載的類名轉換成一個.class文件名,然后從文件系統(tǒng)中找到該文件并讀取其中的內(nèi)容,這種類裝載器也不是直接將.class文件中的內(nèi)容原封不動地返回給Java虛擬機,它需要將.class文件中的內(nèi)容轉換成Java虛擬機使用的類字節(jié)碼。不管類裝載器采用什么方式,只要能夠在內(nèi)存中制造出給Java虛擬機調(diào)用類字節(jié)碼即可,所以把類裝載器描述為類字節(jié)碼的制造器更容易讓人理解。?
?
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文件夾下面,所以可以訪問到該文件
?
由于對數(shù)據(jù)庫的操作方法有很多,不能每個方法里面都寫這種,所以可以使用靜態(tài)代碼塊的方式。
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.文件不能太大,因為它是以裝載類的方式一次性加入內(nèi)存中
2.類裝載器只會加載一次,就是說不能顯示文件的更新操作
?
3.使用絕對路徑讀取
如果需要讀到實時數(shù)據(jù),就不能通過類裝載器來讀文件,需要通過普通的文件路徑的方式
還是要通過類裝載的方式來得到文件的位置
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"); }}?
?
?
轉載于:https://www.cnblogs.com/tech-bird/p/3843832.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的在javaweb中通过servlet类和普通类读取资源文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的传值与传引用
- 下一篇: 数学图形(1.43)贝壳形曲线与鱼形曲线