小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

告別獲取不安全的相對路徑-取當前類的Classpath

 WindySky 2009-04-03

這是一個古老的話題了,我曾經寫過一篇文章討論這個話題

http://blog.csdn.net/sunyujia/archive/2008/01/05/2027087.aspx

取得相對路徑的方法有很多,但是安全的方法并不多,我什么這么說呢?

我先說下一些流行方法的不安全性

轉載請注明出處http://blog.csdn.net/sunyujia/

1.new File(./xx.txt);或者是new File(xx.txt);

這種方法實際上是和window操作系統(tǒng)有關系的,對批處理和Win32編程有研究的朋友知道,運行一個程序要讓操作系統(tǒng)知道兩點,1是文件存放的所在位置,2是文件的起始位置,這個起始位置很重要的,文件可以放置在C:\,而起始位置可以是D:\

感興趣的朋友可以試試新建立一個批處理test.bat

dir 
pause
放置在c盤運行它,可以列出c盤的目錄

然后在這個批處理文件上面創(chuàng)建一個快捷方程式,然后右鍵->屬性->修改它的起始位置為d盤

點擊這個快捷方程式再看結果,如何?列出的是d盤的目錄.

所以在java中使用new File(xx.txt);是非常不安全的,因為.這個路徑的到底在哪里,取決于調用java 命令的起始位置定義在哪里.

tomcat/bin 下面的catalina.bat調用了java所以在tomcat環(huán)境下"."的位置就是tomcat/bin,但是eclipse啟動程序,起始位置就是eclipse的項目路徑下了.不多說,大家已經可以看出來了,這不是一個好方法.因為不能通過程序所在位置來確定一個路徑.

當然并不是說這種方法就不可取,熟悉命令的朋友會想到在啟動java.exe的時候將%CD%傳進jvm里面,這是個方法,但是未免太麻煩了些.

2.類.class.getClassLoader().getResource("");

這也算是個比較流行的方法,但是使用它獲取相對路徑很不明朗,因為大部分情況我們希望相對路徑針對我們的class來說是固定的,如果使用此方法,這把決定權交給了類加載器,例如tomcat的類加載是非委托機制的,而weblogic的類加載是委托機制的,僅憑此一點就決定了,使用此方法不能保證在任何環(huán)境下,相對路徑是真正相對于class文件的.它是不安全的,不過大部分情況下它是安全的.我也在相當長的一段時間內認為他是安全的,后來在weblogic的一個復雜類加載器環(huán)境中發(fā)現它的不安全性.

3.類.class.getResource("")

看上去這確實是個好方法,但是它的局限性在于如果類在jar中的話,那么在打jar包的時候需要將文件夾也一起打進去,否則會返回null,jar文件實際上就是zip文件,zip文件中:文件是文件,文件夾是文件夾,不是關聯(lián)在一起的,很多開源的jar包就沒有把目錄打進去只打了classes文件,雖然你能夠看到文件的目錄層次結構,但是調用類.class.getResource("")會返回null的.因為文件的目錄結構和文件夾本身是兩回事.對于這個問題可追溯到我以前的一篇帖子http://topic.csdn.net/u/20080520/21/1dc25316-8316-46f8-904b-ded9c4b7587a.html

至于在web應用中取相對路徑的方法我就不說了,因為他有局限性,我這里說的都是在任何環(huán)境下都可以使用的方法.

取相對路徑最安全的的方法是什么呢?答案是取類本身在系統(tǒng)中存儲的文件位置,然后根據包層次向上一直找到Classpath下面:實現非常簡單,好了不多說了放代碼:

package com.syj.util;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;

/**
 * <p>
 * Title:URL輔助工具類
 * </p>
 *
 * <p>
 * Copyright: 轉載請注明出處http://blog.csdn.net/sunyujia/
 * </p>
 *
 * @author 孫鈺佳
 * @main sunyujia@yahoo.cn
 * @date Sep 21, 2008 12:31:23 PM
 */
public class URLUtil {
    /**
     *
     * Description:取得當前類所在的文件
     *
     * @param clazz
     * @return
     * @mail sunyujia@yahoo.cn
     * @since:Sep 21, 2008 12:32:10 PM
     */
    public static File getClassFile(Class clazz) {
        URL path = clazz.getResource(clazz.getName().substring(
                clazz.getName().lastIndexOf(".") + 1)
                + ".class");
        if (path == null) {
            String name = clazz.getName().replaceAll("[.]", "/");
            path = clazz.getResource("/" + name + ".class");
        }
        return new File(path.getFile());
    }

    /**
     *
     * Description:同getClassFile 解決中文編碼問題
     *
     * @param clazz
     * @return
     * @mail sunyujia@yahoo.cn
     * @since:Sep 21, 2008 1:10:12 PM
     */
    public static String getClassFilePath(Class clazz) {
        try {
            return java.net.URLDecoder.decode(getClassFile(clazz)
                    .getAbsolutePath(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     *
     * Description:取得當前類所在的ClassPath目錄
     *
     * @param clazz
     * @return
     * @mail sunyujia@yahoo.cn
     * @since:Sep 21, 2008 12:32:27 PM
     */
    public static File getClassPathFile(Class clazz) {
        File file = getClassFile(clazz);
        for (int i = 0, count = clazz.getName().split("[.]").length; i < count; i++)
            file = file.getParentFile();
        if (file.getName().toUpperCase().endsWith(".JAR!")) {
            file = file.getParentFile();
        }
        return file;
    }

    /**
     *
     * Description: 同getClassPathFile 解決中文編碼問題
     *
     * @param clazz
     * @return
     * @mail sunyujia@yahoo.cn
     * @since:Sep 21, 2008 1:10:37 PM
     */
    public static String getClassPath(Class clazz) {
        try {
            return java.net.URLDecoder.decode(getClassPathFile(clazz)
                    .getAbsolutePath(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "";
        }
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(getClassFilePath(URLUtil.class));
        System.out.println(getClassPath(URLUtil.class));
    }
}

 

在eclipse下執(zhí)行

輸出為

D:\SYJ.WORK\SYJ.WORKSPACE\ws1\util\classes\com\syj\util\URLUtil.class
D:\SYJ.WORK\SYJ.WORKSPACE\ws1\util\classes
打成jar包后在桌面下執(zhí)行

輸出為
file:\C:\Documents and Settings\Administrator\桌面\util.jar!\com\syj\util\URLUtil.class
file:\C:\Documents and Settings\Administrator\桌面

所取得的路徑一直都是class文件的classpath目錄.

大家可以在任意類加載環(huán)境下進行測試


原文網址:http://blog.csdn.net/sunyujia/archive/2008/09/21/2957481.aspx

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多