`

Java 中获取资源(文件)的路径问题总结

阅读更多

Java 中获取资源(文件)的路径问题总结

 

首先,Java 中获取资源大体上可分为两种方式,基于 文件系统的 和 基于classpath的.

 

 

1. 基于文件系统的相对简单.

 

   比如 构造一个File f = new File('text.txt');

   这里传递给File构造函数的可以是相对路径比如text.txt就是相对路径,

   也可以是绝对路径比如 new File('C:/text.txt');

   

   需要注意的是,这里相对路径,相对的是System.getProperties("user.dir")的

   比如 你用window中的cmd 通过调用java命令来来执行一个java程序,

   那么,cmd中的当前路径,就是Java程序中的相对路径

   

   比如 C:\>  java test 执行这条命令,相对路径就在C盘.

   

2. 基于classpath的

 

   我们知道,java 命令执行的时候可以指定一个classpath,系统默认在这个classpath目录

   下面查找各种calss.文件,jar包,配置文件等.

   

   基于classpath 获取资源有以下三种方式:

   

   

URL url = this.getClass().getResource("resource_name");
   URL url = this.getClass().getClassLoader().getResource("resource_name");
   URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");

 

 

   

   第一种是通过Class类实例的getResource方法,后面两种都是ClassLoader类实例的getResource方法.

   

   Class.getResource()也是委托ClassLoader的getResource方法来实现的.

   

   所以,先说ClassLoader的getResource方法:

   

   (1) ClassLoader的getResource方法参数不能以"/"开头,而且必须是从根目录开始查找,

   

   这里的根目录是classpath中的目录以及包含引用的jar.

   比如eclipse的默认将每个工程中Java类运行时的classpath设置为: 

   工程根目录/bin目录 以及 工程中引用的所有jar包.

   

   在编译的时候,将src目录结构拷贝到bin目录中,将java类编译成class文件后连同其他文件按src中原始目录结构

   拷贝到bin目录中.

   

   假设某个工厂的classpath如下(两个):

   /bin

   log4j-1.2.16.jar

   

   其中log4j-1.2.16.jar中有目录结构org\apache\log4j\ (与包org.apach.log4j) 对应

   

   那么 查找bin目录下的test.txt文件  使用下面方法

   ClassLoader.getResource("test.txt");

   注意这里ClassLoader.getResource方法的入参必须是从根目录开始查找,这里根目录就是classpath中的/bin.

   找 bin/level1/level2/ll.txt文件必须使用

   ClassLoader.getResource("level1/level2/ll.txt"); //注意查找必须基于根目录(/bin),并且目录结构也要写对,不能用/开头

   

   (2) Class.getResource() 略有不同: 

       (a)可以通过相对路径查找,相对的是 当前实例的Class文件所在的包;

       (b)也可以和ClassLoader.getResource()一样从根目录(classpath)开始查找,

          但是此时传递给Class.getResource()的参数必须要用 "/" 开头,

          否则就是相对查找了((a)中的情况)

          其实,这种代码就是将/去掉,然后调用ClassLoader.getResource()

          参考代码:

          

public java.net.URL getResource(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }
    
    private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        if (!name.startsWith("/")) {
            Class c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();
            int index = baseName.lastIndexOf('.');
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;
            }
        } else {
            name = name.substring(1);
        }
        return name;
    }

 

          

    需要注意的是,这种基于classpath查找的情况,在写代码之前需要把各种系统的classpath研究清楚.

    比如Tomcat的不同版本classpath的设置不同,需要了解清楚(参考:http://my.oschina.net/dongming/blog/64142)

    

    关于 getClassLoader().getResource 和 Thread.currentThread().getContextClassLoader().getResource区别:

    因为类似Tomcat这类的容器,可能使用了自定义的ClassLoader产生了特殊的classpath,这样就需要遵循特殊的方式,

    Thread.currentThread().getContextClassLoader()返回该线程的上下文 ClassLoader,再调用getResource更保险

    一些,一般推荐使用Thread.currentThread().getContextClassLoader().getResource方式获取资源.

1
0
分享到:
评论

相关推荐

    Java 中几种获取文件路径的方式

    Java 开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。 2. 文件的路径 文件的路径通常有 相对路径 与 绝对路径。 2.1 相对路径 以当前文件为基准...

    解决java打包之后无法加载静态资源的问题SWTResourceManager.java源码

    利用swt中的一个获取图片的类...打成jar包后,获取图片的路径中有"xxx.jar!"这里面的内容是不能够被操作系统识别出来的,因此直接通过路径来获取文件是不可能,使用SWTResourceManager可实现这一功能。

    基于Java的minio相关操作示例

    基于springboot的小型Java项目,主要与minio存储有关,包含了各种minio相关操作,包括新建bucket存储桶、查询文件列表、文件上传、下载、预览等。个人资源,请勿转载

    获取类路径下资源

    类(包括class文件)可以存储在目录或jar文件中,或者存储在两者的组合中,但是只有在它们位于类路径中的某个地方时,java编译器或解释器才可以找到它们。而类路径对一个javaweb应用而言,就是WEB-INF/classes下和WEB-...

    读取分析Excel所有jar包和java示例文件

    本资源包换所有读取分析excel的jar包和我写的用这些包读取分析excel文件的两个.java文件。

    PathUtils 路径拼接工具类

    获取资源在不同系统下路径,拼接资源在不同系统下的路径。

    java获取百度网盘分享的真实地址并下载

    java获取百度网盘真实下载路径,根据请求返回的真实地址,自动下载网盘文件。

    Java多个文件根据URL下载后打包zip导出.zip

    Java根据Url把多个文件下载到指定的文件夹目录,然后再将文件夹目录打包成zip导出,包括子目录也可以打包,有个简单的导出html页面,点击导出按钮下载zip。

    java 文件指纹读取

    一个类,用于获取指定路径下文件的各种指纹信息,已经打成jar包,导入后很方便调用,上传以备日后使用。 里面只有5个公共静态方法: public static String getFileMD5(String filename);/*获取指定路径下文件的MD5...

    Java文件上传servlet接口

    一个简单的Java文件上传servlet接口,文件上传成功后返回json格式响应数据,app可以调用此接口上传图片等文件到服务器,获取资源网络路径url

    springboot如何获取相对路径文件夹下静态资源的方法

    主要介绍了springboot如何获取相对路径文件夹下静态资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA_API1.6文档(中文)

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    SpringBoot 实现文件上传到本地目录 并返回可访问的文件地址.rar

    SpringBoot 实现文件上传到本地目录 并返回可访问的文件地址

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

Global site tag (gtag.js) - Google Analytics