日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java加載文件的3種方式

 流浪在北京 2011-03-14
java加載文件的3種方式
文章分類:JavaEye
    一般我們加載文件都是以下3種方式進(jìn)行加載,之前一直困擾我很久的關(guān)于文件加載的路徑問題,今天我想自己寫一個wiki page來記錄下,總結(jié)下:
1,通過類加載器
   這種方式是通過java自己的類加載器來加載文件,根目錄為java類的打包出來后的根目錄。相對目錄就是當(dāng)前類所在的包位置。如果你希望加載的文件是保存在類加載器能訪問到的目錄,推薦使用此加載方式(web應(yīng)用中web-inf下的文件出于安全機(jī)制的考慮是不能通過web-inf進(jìn)行加載的)
Java代碼  
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);  
2,通過文件系統(tǒng)加載
    這種方式是通過系統(tǒng)的文件系統(tǒng)機(jī)制進(jìn)行加載,它接受的參數(shù)(文件路徑)是一個絕對路徑地址,你可能會覺得這樣的話文件路徑會在代碼中hard coding,不優(yōu)雅,當(dāng)然你可以選擇用很多種方式獲得項(xiàng)目的路徑再進(jìn)行相應(yīng)的相對路徑拼裝,至少我是這么做的。
Java代碼  
InputStream inputStream = new FileInputStream(file);  
    但是有個很重要的問題需要說明,看下面的例子(在weblogic應(yīng)用服務(wù)器中):
    其中使用到了Log4J作為日志輸出工具,Log4J的配置文件log4j.propertes放在 DefaultWebApp\WEB-INF目錄下。Log4J通過一個自動加載的Servlet進(jìn)行初始化,初始化代碼如下: 
   
Java代碼  
ServletContext context = getServletContext();     
org.apache.log4j.PropertyConfigurator.    
configure(context.getRealPath("/")    
+ "/WEB-INF/log4j.properties");    
     其中,context.getRealPath("/")得到當(dāng)前Web應(yīng)用的真實(shí)根目錄,比如,如果你的WebLogic安裝在D:\bea下,在Windows下context.getRealPath("/")通常會返回:D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp。這樣,和 "/ WEB-INF /log4j.properties"拼接后,就得到了log4j.properties文件的真實(shí)路徑。現(xiàn)在一切正常!測試通過后,將DefaultWebApp下的所有文件打?yàn)橐粋€.war包,進(jìn)行部署時,發(fā)現(xiàn)系統(tǒng)報(bào)告找不到“D:\bea \wlserver6.1\null\ WEB-INF \log4j.properties”文件!如果你的應(yīng)用中還需要讀取其它已經(jīng)被打包到war包中的文件,都會報(bào)告找不到文件。并且,系統(tǒng)并不會到D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp 目錄下尋找,而會到D:\bea\wlserver6.1\null下尋找。這是因?yàn)閏ontext.getRealPath("/")返回了null。
     查看ServletContext的API文檔,原來,對一個打包的應(yīng)用來說,是沒有RealPath的概念的,調(diào)用getRealPath 只會簡單地返回null。其實(shí),也很好理解,一個文件被打包入了.war文件,就不存在目錄結(jié)構(gòu)了(雖然包中仍然存在目錄結(jié)構(gòu),但這不等同于文件系統(tǒng)中的目錄結(jié)構(gòu))。所以,對war包中的資源是無法得到RealPath的。這樣也就無從通過文件IO進(jìn)行讀取了。那么,如何讀取war包中的資源呢?答案是使用ServletContext.getResourceAsStream(String)方法。那么,現(xiàn)在對于war應(yīng)用可以成功運(yùn)行,但如果現(xiàn)在不通過war部署,直接通過目錄結(jié)構(gòu)部署應(yīng)用會不會又出現(xiàn)找不到資源的錯誤呢?請來看看 ServletContext.getResourceAsStream的API文檔,
Java代碼  
# Returns a URL to the resource that is     
# mapped to a specified path. The path     
# must begin with a "/" and is interpreted    
# as relative to the current context root.     
# This method allows the servlet container     
# to make a resource available to servlets    
# from any source. Resources can be located     
# on a local or remote file system,    
# in a database, or in a .war file.    
#     
     可見,通過getResourceAsStream可以獲取包括本地文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)、war包等資源。不會出現(xiàn)上面擔(dān)心的問題。
     結(jié)論:在開發(fā)J2EE Web應(yīng)用時,如果需要讀取本應(yīng)用中的文件,盡量使用ServletContext.getResourceAsStream進(jìn)行,而不要使用文件IO。getRealPath在不同的服務(wù)器中獲得的參數(shù)是不一樣的,有些會返回空,有些會返回正常數(shù)據(jù),這就要看服務(wù)器是否解包文件了,而且有些服務(wù)器中g(shù)etRealPath是本身就以"/"結(jié)尾的,這里是最好進(jìn)行下判斷:
Java代碼  
realPath.endsWith("/")?realPath:(realPath+"/")  
  

3,web程序可以通過ServletContext進(jìn)行加載
    一個特定資源的URL可以通過調(diào)用ServletContext.getResource(String path)得到,這兒的path參數(shù)必須以“/”開始,將被解析為相對于當(dāng)前Servlet背景的根的相對路徑。這個方法有別于基于類加載器的 java.lang.Class.getResource方法。假如你通過ServletContext.getResource方法請求了一個.jsp 頁面,你得到的將是JSP的源碼,要得到執(zhí)行結(jié)果,可以使用RequestDispatcher對象的include方法。你也可以直接以輸入流的形式得到資源,
  
Java代碼  
public InputStream getResourceAsStream(String path);  
    上個例子已經(jīng)很好的聯(lián)合文件io來對2者進(jìn)行了比較了。
Java代碼  
inputStream = sc.getResourceAsStream(EnumConstants.SERVER_CONFIGURATION_FILEPATH.toString());  
  /** 
    *"SERVER_CONFIGURATION_FILEPATH"  server configuration reflection class properties file path  <b>"/config/server-config.properites"  
    */  
    public static final EnumConstants SERVER_CONFIGURATION_FILEPATH                                 = new EnumConstants("/config/server-config.properites");  
© 2003-2011 JavaEye.com. All rights reserved. 上海炯耐計(jì)算機(jī)軟件有限公司 [ 滬ICP備05023328號 ]

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多