這是一個(gè)古老的話題了,我曾經(jīng)寫過一篇文章討論這個(gè)話題 http://blog.csdn.net/sunyujia/archive/2008/01/05/2027087.aspx 取得相對(duì)路徑的方法有很多,但是安全的方法并不多,我什么這么說呢? 我先說下一些流行方法的不安全性 轉(zhuǎn)載請(qǐng)注明出處http://blog.csdn.net/sunyujia/ 1.new File(./xx.txt);或者是new File(xx.txt); 這種方法實(shí)際上是和window操作系統(tǒng)有關(guān)系的,對(duì)批處理和Win32編程有研究的朋友知道,運(yùn)行一個(gè)程序要讓操作系統(tǒng)知道兩點(diǎn),1是文件存放的所在位置,2是文件的起始位置,這個(gè)起始位置很重要的,文件可以放置在C:\,而起始位置可以是D:\ 感興趣的朋友可以試試新建立一個(gè)批處理test.bat dir 然后在這個(gè)批處理文件上面創(chuàng)建一個(gè)快捷方程式,然后右鍵->屬性->修改它的起始位置為d盤 點(diǎn)擊這個(gè)快捷方程式再看結(jié)果,如何?列出的是d盤的目錄. 所以在java中使用new File(xx.txt);是非常不安全的,因?yàn)?這個(gè)路徑的到底在哪里,取決于調(diào)用java 命令的起始位置定義在哪里. tomcat/bin 下面的catalina.bat調(diào)用了java所以在tomcat環(huán)境下"."的位置就是tomcat/bin,但是eclipse啟動(dòng)程序,起始位置就是eclipse的項(xiàng)目路徑下了.不多說,大家已經(jīng)可以看出來了,這不是一個(gè)好方法.因?yàn)椴荒芡ㄟ^程序所在位置來確定一個(gè)路徑. 當(dāng)然并不是說這種方法就不可取,熟悉命令的朋友會(huì)想到在啟動(dòng)java.exe的時(shí)候?qū)?CD%傳進(jìn)jvm里面,這是個(gè)方法,但是未免太麻煩了些. 2.類.class.getClassLoader().getResource(""); 這也算是個(gè)比較流行的方法,但是使用它獲取相對(duì)路徑很不明朗,因?yàn)榇蟛糠智闆r我們希望相對(duì)路徑針對(duì)我們的class來說是固定的,如果使用此方法,這把決定權(quán)交給了類加載器,例如tomcat的類加載是非委托機(jī)制的,而weblogic的類加載是委托機(jī)制的,僅憑此一點(diǎn)就決定了,使用此方法不能保證在任何環(huán)境下,相對(duì)路徑是真正相對(duì)于class文件的.它是不安全的,不過大部分情況下它是安全的.我也在相當(dāng)長的一段時(shí)間內(nèi)認(rèn)為他是安全的,后來在weblogic的一個(gè)復(fù)雜類加載器環(huán)境中發(fā)現(xiàn)它的不安全性. 3.類.class.getResource("") 看上去這確實(shí)是個(gè)好方法,但是它的局限性在于如果類在jar中的話,那么在打jar包的時(shí)候需要將文件夾也一起打進(jìn)去,否則會(huì)返回null,jar文件實(shí)際上就是zip文件,zip文件中:文件是文件,文件夾是文件夾,不是關(guān)聯(lián)在一起的,很多開源的jar包就沒有把目錄打進(jìn)去只打了classes文件,雖然你能夠看到文件的目錄層次結(jié)構(gòu),但是調(diào)用類.class.getResource("")會(huì)返回null的.因?yàn)槲募哪夸浗Y(jié)構(gòu)和文件夾本身是兩回事.對(duì)于這個(gè)問題可追溯到我以前的一篇帖子http://topic.csdn.net/u/20080520/21/1dc25316-8316-46f8-904b-ded9c4b7587a.html 至于在web應(yīng)用中取相對(duì)路徑的方法我就不說了,因?yàn)樗芯窒扌?我這里說的都是在任何環(huán)境下都可以使用的方法. 取相對(duì)路徑最安全的的方法是什么呢?答案是取類本身在系統(tǒng)中存儲(chǔ)的文件位置,然后根據(jù)包層次向上一直找到Classpath下面:實(shí)現(xiàn)非常簡單,好了不多說了放代碼: package com.syj.util; import java.io.File; /** /** /** /** public static void main(String[] args) throws UnsupportedEncodingException {
在eclipse下執(zhí)行 輸出為 D:\SYJ.WORK\SYJ.WORKSPACE\ws1\util\classes\com\syj\util\URLUtil.class 輸出為 所取得的路徑一直都是class文件的classpath目錄. 大家可以在任意類加載環(huán)境下進(jìn)行測(cè)試
|
|