zoukankan      html  css  js  c++  java
  • 关于Class.getResource和ClassLoader.getResource的路径问题

    我们都知道,在java中有绝对路径和相对路径之分

    绝对路径:以盘符或者/开头的路径。和当前路径没有任何关系

    相对路径:不以盘符或者/开头的路径。以当前路径为基准进行计算

    例如:

    1         System.out.println(new File("").getAbsolutePath());
    2         System.out.println(new File("/").getAbsolutePath());

    上述两行代码,的输出结果为:

    D:EclipseworkspacePathDemo
    D:

    其中PathDemo为我们的工程名,因此这样得到的相对路径是相对于当前工程的路径,而"/"代表根目录,所以直接输出了盘符。

    一、下面说明一下关于Class.getResource和ClassLoader.getResource的路径问题

    Class.getResource(String path)

    path不以’/'开头时,默认是从此类所在的包下取资源;
    path  以’/'开头时,则是从bin目录下获取,准确的说是在.class文件所在的目录下

    看下面的例子:

    1         System.out.println(PathClass.class.getResource("").getPath());
    2         System.out.println(PathClass.class.getResource("/").getPath());

    这两行代码输出的结果为:

    /D:/Eclipse/workspace/PathDemo/bin/pathdemo/
    /D:/Eclipse/workspace/PathDemo/bin/

    可以看出,以“/”开头,则是从bin目录下获取,不以"/"开头,则从此类所在的包下获取

    如果我们要获取1.txt的路径,用Class.getResource(String path)就有两种写法了,如下

    1         System.out.println(PathClass.class.getResource("1.txt").getPath());
    2         System.out.println(PathClass.class.getResource("/pathdemo/1.txt").getPath());

    得到的结果为:

    /D:/Eclipse/workspace/PathDemo/bin/pathdemo/1.txt
    /D:/Eclipse/workspace/PathDemo/bin/pathdemo/1.txt

    Class.getClassLoader().getResource(String path)

    path不能以’/'开头时;
    path是从bin目录下获取;

    同样的,我们看下面两行代码

    1         System.out.println(PathClass.class.getClassLoader().getResource("").getPath());
    2         System.out.println(PathClass.class.getClassLoader().getResource("/").getPath());

    输出结果为:

    /D:/Eclipse/workspace/PathDemo/bin/
    Exception in thread "main" java.lang.NullPointerException
    很显然,不能以“/”开头,否则会报空指针异常。

    从而也得到结论:

    .class.getResource("/") == Class.getClassLoader().getResource("")

    同样的,我们想得到上图中1.txt的路径,只有一种办法,如下

    System.out.println(PathClass.class.getClassLoader().getResource("pathdemo/1.txt").getPath());

    得到的结果为:

    /D:/Eclipse/workspace/PathDemo/bin/pathdemo/1.txt 

    二、在servlet中,上面的所有内容都有所区别

    首先,绝对路径和相对路径有区别,看如下两行代码:

    1         System.out.println(new File("").getAbsolutePath());
    2         System.out.println(new File("/").getAbsolutePath());

    浏览器产生响应之后,输出结果为:

    G:webEclipse omcat7in
    G:

    可见,以"/"开头的绝对路径没区别,仍然是回到根目录,而不以盘符开头的相对路径则变成了tomcat下的bin目录。

    看如下代码:

    1         System.out.println(PathServlet.class.getResource("").getPath());
    2         System.out.println(PathServlet.class.getResource("/").getPath());
    3         System.out.println(PathServlet.class.getClassLoader().getResource("").getPath());
    4         System.out.println(PathServlet.class.getClassLoader().getResource("/").getPath());

    输出结果为:

    /G:/webEclipse/tomcat7/webapps/PathDemo/WEB-INF/classes/pathdemo/
    /G:/webEclipse/tomcat7/webapps/PathDemo/WEB-INF/classes/
    /G:/webEclipse/tomcat7/webapps/PathDemo/WEB-INF/classes/
    /G:/webEclipse/tomcat7/webapps/PathDemo/WEB-INF/classes/

    可以看出,Class.getResource和上面完全相同,以“/”开头,则指向该类所在的包的目录下,不以"/"开头,则指向WEB-INF的classes目录。

    ClassLoader.getResource则不再限制使用"/"开头,即:对于ClassLoader.getResource,使用"/"与否,都是指向WEB-INF的classes目录。

    当然,还有一种方法是使用ServletContext对象的getRealPath的方法,此方法要传入的路径是相对于WebRoot根目录的路径,如下代码:

            System.out.println(this.getServletContext().getRealPath(""));

    输出结果为:

    G:webEclipse omcat7webappsPathDemo

    可以看出,这种方法得到的路径是指向该web应用的根目录的。

  • 相关阅读:
    如何测试一个纸杯?
    你对测试最大的兴趣在哪里?为什么
    您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?
    BUG管理工具的跟踪过程(用BugZilla为例子
    说说你对集成测试中自顶向下集成和自底向上集成两个策略的理解,要谈出它们各自的优缺点和主要适应于哪种类型测试
    你认为做好测试计划工作的关键是什么
    单元测试、集成测试、系统测试的侧重点是什么?
    黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!
    Python 运算符
    Python 基础数据类型
  • 原文地址:https://www.cnblogs.com/haojiejiejie/p/9123729.html
Copyright © 2011-2022 走看看