`
城的灯
  • 浏览: 152411 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

告别获取不安全的相对路径-取当前类的Classpath(转)

    博客分类:
  • 2011
 
阅读更多

特此申明:本文属于转载,感谢原作者的辛勤付出!(作者博客:http://blog.csdn.net/sunyujia

 

 

 

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

这种方法实际上是和window操作系统有关系的,对批处理和Win32编程有研究的朋友知道,运行一个程序要让操作系统知道两点,1是文件存放的所在位置,2是文件的起始位置,这个起始位置很重要的,文件可以放置在C:\,而起始位置可以是D:\

感兴趣的朋友可以试试新建立一个批处理test.bat

dir 
pause
放置在c盘运行它,可以列出c盘的目录

然后在这个批处理文件上面创建一个快捷方程式,然后右键->属性->修改它的起始位置为d盘

点击这个快捷方程式再看结果,如何?列出的是d盘的目录.

所以在java中使用new File(xx.txt);是非常不安全的,因为.这个路径的到底在哪里,取决于调用java 命令的起始位置定义在哪里.

tomcat/bin 下面的catalina.bat调用了java所以在tomcat环境下"."的位置就是tomcat/bin,但是eclipse启动程序,起始位置就是eclipse的项目路径下了.不多说,大家已经可以看出来了,这不是一个好方法.因为不能通过程序所在位置来确定一个路径.

当然并不是说这种方法就不可取,熟悉命令的朋友会想到在启动java.exe的时候将%CD%传进jvm里面,这是个方法,但是未免太麻烦了些.

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

这也算是个比较流行的方法,但是使用它获取相对路径很不明朗,因为大部分情况我们希望相对路径针对我们的class来说是固定的,如果使用此方法,这把决定权交给了类加载器,例如tomcat的类加载是非委托机制的,而weblogic的类加载是委托机制的,仅凭此一点就决定了,使用此方法不能保证在任何环境下,相对路径是真正相对于class文件的.它是不安全的,不过大部分情况下它是安全的.我也在相当长的一段时间内认为他是安全的,后来在weblogic的一个复杂类加载器环境中发现它的不安全性.

3.类.class.getResource("")

看上去这确实是个好方法,但是它的局限性在于如果类在jar中的话,那么在打jar包的时候需要将文件夹也一起打进去,否则会返回null,jar文件实际上就是zip文件,zip文件中:文件是文件,文件夹是文件夹,不是关联在一起的,很多开源的jar包就没有把目录打进去只打了classes文件,虽然你能够看到文件的目录层次结构,但是调用类.class.getResource("")会返回null的.因为文件的目录结构和文件夹本身是两回事.对于这个问题可追溯到我以前的一篇帖子http://topic.csdn.net/u/20080520/21/1dc25316-8316-46f8-904b-ded9c4b7587a.html

至于在web应用中取相对路径的方法我就不说了,因为他有局限性,我这里说的都是在任何环境下都可以使用的方法.

取相对路径最安全的的方法是什么呢?答案是取类本身在系统中存储的文件位置,然后根据包层次向上一直找到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 孙钰佳
 * @mainsunyujia@yahoo.cn
 * @date Sep 21, 2008 12:31:23 PM
 */
public class URLUtil {
    /**
     *
     * Description:取得当前类所在的文件
     *
     * @param clazz
     * @return
     * @mailsunyujia@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
     * @mailsunyujia@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
     * @mailsunyujia@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
     * @mailsunyujia@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下执行

输出为

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

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

所取得的路径一直都是class文件的classpath目录.

分享到:
评论

相关推荐

    13-Java语言(classpath环境变量)

    默认情况下,JVM会查找当前目录(".")下的类文件,但如果类文件位于其他位置,就需要通过设置classpath来指定这些路径。 二、classpath的设置方式 1. 系统环境变量:在操作系统级别设置,例如在Windows中,可以...

    java项目中获取路径详解

    Java 项目中获取路径详解 在 Java 项目中,获取路径是非常重要的,因为它关系到项目的正确运行。特别是在 Java Web 项目中,获取路径变得更加复杂。下面我们将详细讨论 Java 项目中获取路径的方法和注意事项。 ...

    java中File的相对路径与绝对路径总结

    - **相对路径**:指的是相对于当前工作目录或类路径(Classpath)的一种路径表示方式。 - **绝对路径**:则是一种完整地指明文件位置的方式,从文件系统的根目录开始直至文件本身。 #### 相对路径的应用场景 1. **...

    java项目相对路径与绝对路径问题分析

    4. `FileTest.class.getClassLoader().getResource("")`:再次,这个方法也用于获取当前ClassPath的绝对URI路径,路径结果和之前的一致。 5. `ClassLoader.getSystemResource("")`:这个方法返回的是系统类加载器的...

    Java 实例 - classpath使用实例-classpath使用教程-手把手教程.zip

    在Java编程环境中,classpath是一个至关重要的概念,它决定了Java虚拟机(JVM)在哪里寻找所需的类文件。本教程将深入探讨classpath的使用,并提供手把手的实践指导,帮助开发者更好地理解和运用这一关键设置。 首先...

    java中path和classpath的设置

    如果遇到类似`Exception in thread "main" java.lang.NoClassDefFoundError`这样的错误,很可能是由于`classpath`设置不正确导致的。此时,需要检查`classpath`是否包含了必要的类库路径,并确保没有遗漏。 总之,...

    Java中获取类路径classpath的简单方法(推荐)

    在Java编程语言中,了解如何获取类路径(classpath)是至关重要的,因为类路径决定了Java虚拟机(JVM)在运行时如何查找和加载类。本文将详细介绍在Java中获取类路径的几种常见方法,以供开发者参考。 首先,类路径...

    java文件路径获取

    ### Java 文件路径获取方法详解 #### 一、引言 在Java开发中,经常会遇到需要获取文件路径的情况,尤其是在处理配置文件、图片等资源时。本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好...

    浅析Spring配置中的classpath:与classpath*:的区别

    4. 如果要加载的资源,不在当前 ClassLoader 的路径里,那么用 classpath: 前缀是找不到的,这种情况下就需要使用 classpath*: 前缀。 5. 在多个 classpath 中存在同名资源,都需要加载时,那么用 classpath: 只会...

    JAVA获取CLASSPATH路径的方法详解

    此外,为了获取`CLASSPATH`之外的路径,开发者可以使用自定义的类加载器或者通过配置文件来指定额外的搜索路径。自定义类加载器允许扩展默认的类加载机制,从而加载不在标准类路径中的类和资源。 总结起来,理解并...

    Java路径问题

    本文将深入探讨Java中的路径问题,包括绝对路径、相对路径、类加载器路径以及类路径的配置。 1. 绝对路径与相对路径 - **绝对路径**:是从根目录开始,完整指明文件或目录位置的路径。在Windows系统中,通常以驱动...

    基于获取JAVA路径,包括CLASSPATH外的路径的方法详解

    总之,理解和掌握这些获取路径的方法对于Java开发来说至关重要,尤其是在处理资源加载、文件操作或系统集成时。通过正确地使用这些方法,可以确保程序在各种环境中都能正常运行,同时提高代码的可移植性和可维护性。

    jdk的classpath路径和环境配置

    如果不设置CLASSPATH,则默认只会在当前目录下查找类文件。 - **PATH**: 系统路径,用于指定操作系统执行命令时可以访问的可执行文件的路径列表。 #### 二、Windows下的JDK环境配置 在Windows系统中,JDK环境变量...

    Classpath Variable 解决办法

    在Java编程环境中,`Classpath`(类路径)是一个至关重要的概念,它是Java虚拟机(JVM)查找和加载.class文件的路径。当我们在开发和运行Java程序时,正确配置Classpath是确保程序能正常运行的关键步骤。这篇文档将...

    总结一下java获取路径几种途径

    相对路径则包括相对于classpath的相对路径和相对于当前用户目录的相对路径。 - **URI形式的绝对资源路径**:如`file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b`,URL是URI的一个特例,可用于资源的打开。 ...

    ant自动获取文件路径

    标题“ant自动获取文件路径”涉及的是Apache Ant这一构建自动化工具在处理文件路径时的技巧。Apache Ant是一个基于Java的构建工具,它被广泛用于Java项目中,类似于Unix的make,但依赖于XML来描述构建过程。在Ant中...

    java classloader classpath 张孝祥

    - 当使用类加载器的方法来获取资源时,一定要确保指定了正确的路径,否则可能导致资源找不到的问题。 通过以上分析可以看出,Java中的类加载器和类路径机制对于程序的运行至关重要。理解这些概念有助于开发者更好地...

    java classpath 理解

    - 这些命令只能显示当前环境变量中的 classpath 设置,并不包含通过其他方式设置的 classpath。 #### 二、在命令行设置 Classpath 在开发过程中,有时需要临时改变 classpath,以测试不同的类库版本或者特定的...

    spring boot加载资源路径配置和classpath问题解决

    需要注意的是,默认的Classpath是不包含当前目录的,这也是Classpath里面要包含一个点的道理。 Tomcat下的Web应用有两个预置的Classpath:WEB-INF/classes和WEB-INF/lib。启动项目,项目就会加载这两个目录里的...

Global site tag (gtag.js) - Google Analytics