日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在javaweb中通过servlet类和普通类读取资源文件

發(fā)布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在javaweb中通过servlet类和普通类读取资源文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

javaweb有兩種方式讀取資源文件

在Servlet中讀取,可以使用servletContextservletContext可以拿到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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。