`

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中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在深入讨论之前,我们需要了解几个基本概念: - **Classpath**: 是Java运行环境的一个重要...

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

    例如,通过`this.getClass().getResource()`方法可以获取资源文件的路径。 ##### 示例代码: ```java File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f.getAbsolutePath()); ...

    JAVA获取各种路径总结

    - 这些方法非常灵活,可以用于获取各种类型的资源文件路径。 通过以上介绍,我们可以看到,在Java开发中,无论是Web开发还是普通的Java应用程序开发,获取路径都是一个非常重要且实用的功能。掌握这些方法,可以...

    JAVA中获取各种路径

    此方法返回类的资源路径,通常用于获取与类相关的资源文件,例如`/D:/TEST/WebRoot/WEB-INF/classes/pack/`,这在加载配置文件、模板等静态资源时非常有用。 #### (2) 获取工作目录路径:`System.getProperty("user...

    JAVA中如何得到文件路径.pdf

    ### JAVA中如何获取文件路径详解 #### 一、概述 在Java编程中,获取文件路径是一项基础而重要的技能。无论是处理本地文件还是部署在Web容器中的应用,了解如何正确地获取文件路径对于程序的正常运行至关重要。本文...

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

    在Java Web应用中,资源文件的位置可能会变化,此时可以通过`ClassLoader`来获取资源的URL或路径。 ```java // 获取当前类的ClassLoader ClassLoader classLoader = this.getClass().getClassLoader(); // 获取资源...

    java Web 中相对路径绝对路径问题总结

    以下是对Java Web中相对路径与绝对路径问题的深入总结: ### 一、路径概念与标准 #### 1. URL与URI URL(Uniform Resource Locator)统一资源定位符,是一种用于标识网络上资源位置的标准格式,如`...

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

    通过以上分析可以看出,在Java中处理文件路径时,根据不同的应用场景选择合适的路径表示方式非常重要。无论是相对路径还是绝对路径,都需要结合具体的项目结构和文件存储位置进行合理的设置。此外,还需要注意不同...

    Java获得某个路径下的所有文件列表,并写入指定文件

    在Java编程中,获取某个路径下所有文件列表并将其写入指定文件是一项常见的任务,尤其在文件管理和系统操作中非常实用。以下是如何实现这个功能的详细步骤和相关知识点。 首先,我们需要导入Java.io和java.nio.file...

    java读取配置文件

    在Java编程中,读取配置文件是常见的任务,特别是在开发需要灵活配置的系统时。配置文件通常用于存储应用程序的设置,如数据库连接信息、服务器端口、第三方服务的API密钥等,这些信息可能需要根据不同的环境或需求...

    java类动态获取相对路径

    在Java编程中,动态获取类的相对路径是一项重要的技能,特别是在处理资源文件或者进行文件操作时。相对路径是相对于当前工作目录或者类加载器的基础路径的路径表示,它可以帮助我们定位到程序运行时所需的文件。下面...

    JAVA获取FTP文件列表

    ### JAVA获取FTP文件列表知识点详解 #### 一、概述 在现代软件开发中,FTP(File Transfer Protocol)是一种广泛使用的协议,用于在网络上进行文件传输。本文档将详细介绍一个基于Java的实用工具类`FtpClientUtil`...

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

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

    java 获取项目文件路径实现方法

    在Java编程中,获取项目文件路径是常见的需求,特别是在处理资源文件、配置文件或进行文件操作时。这里我们将深入探讨几种不同的方法来实现这一目标,同时解析每种方法的适用场景和返回路径的特点。 1. `this....

    JAVA获取项目路径.doc

    ### JAVA获取项目路径 在Java开发中,获取项目的路径是一个非常常见的需求,尤其是在处理文件读写、资源定位等场景时尤为重要。本文将详细介绍如何通过不同的方法来获取项目的各种路径,并结合示例代码进行说明。 ...

    JAVA获取文件绝对路径的方法

    选择合适的方法取决于你是否需要访问类路径中的资源,或者只是简单地获取文件系统的文件路径。在进行文件操作时,确保正确处理路径是非常重要的,因为错误的路径可能导致文件找不到或者出现其他运行时错误。

    java 静态代码块通过类加载器获取资源文件例子

    本案例聚焦于如何利用静态代码块结合类加载器来高效地获取资源文件,尤其是属性配置文件。下面我们将深入探讨这两个概念及其在实际开发中的作用。 首先,静态代码块是在类被加载到JVM(Java虚拟机)时执行的一段...

    java(Web)中相对路径,绝对路径问题总结

    ### Java(Web)中相对路径与绝对路径问题总结 #### 基本概念理解 在Java Web开发中,路径的概念非常重要,因为它们直接影响到资源的加载和处理。路径分为两种类型:绝对路径和相对路径。 **绝对路径**是指文件或...

    在Java程序中获取当前运行程序的路径

    首先,我们可以通过`java.lang.Class`类的`getResource`或`getResourceAsStream`方法来获取类路径中的资源文件路径。这两个方法都是在类路径中查找资源,返回一个URL对象,从中可以获取路径信息。例如,如果我们有一...

Global site tag (gtag.js) - Google Analytics