`

java如何找到项目中的资源文件

    博客分类:
  • java
 
阅读更多

java如何找到项目中的资源文件

举一个简单例子说明

资源文件内容

 

public class Test1 {
    public static void main(String[] args) {
        /**
         * 方法一
         * 当我们写路径的时候,需要注意
         *1.资源文件db.properties放在ClassPath下(src目录中)
         * 我们需要加"/",可以理解为在ClassPath下寻找

         *

         *
         */
        InputStream in = Test1.class.getResourceAsStream("/db.properties");
        
        
        
        /**方法二
         *当采取这种方法时 ,不需要加"/",默认在ClassPath下查找

         *

         *

         * InputStream in = Test1.class.getClassLoader().getResourceAsStream("db.properties");
         *
         */

 


        Properties prop = new Properties();
        try {


            prop.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println("用户名"+username+"密码"+password);
    }

}

 

 

加载资源文件比较常用的有两种:

一、用ClassLoader,说到这里就不得不提一下ClassLoader的分类,java内置的ClassLoader主要有三种,

第一种是根类加载器(bootstrap class loader),用C++来编写,负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。 所负责加载的包:BootStrp------>JRE/lib/rt.jar

第二种是扩展类加载器(ExtClassLoader),由java类编写,负责将JRE中的一些类加载进内存中。所负责加载的包: ExtClassLoader---------->JRE/lib/ext/*.jar

第三种是应用类加载器(AppClassLoader)或者叫做系统类加载器,负责将CLASSPATH中的类加载到内存中。可以通过ClassLoader.getSystemClassLoader()来获取应用类加载器;

 

再来所说加类载器的继承,类加载器不是垂直继承的父子关系,而是一种组合关系,可以通过实例化类加载器时,将父类加载器的实例作为构造参数传到类加载器中。

关于类加载器的详细资料,可以自行搜索。

 

获取到应用类加载器之后,就是获取资源文件了,调用loader.getResource(path)可以加载相应路径下的资源文件,不能以‘/’开头,关于包内的资源可以把包当做普通的文件夹,以'/'分隔每个包。

如:URL url2 =  ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是获取demo包内的names.ser序列化文件。

二、用需要加载的当前类的getResource方法来加载,其实这个方法也是调用的加载这个类的类加载器来获得资源文件的,只不过是获取的参数不同。

 (1)要想获取class所在包内的文件可以用相对路径直接访问包内的资源;如:Demo1.class.getResource("names.ser");获取的是Demo1的class文件所在包内的资源

 (2)要想获取包外的资源文件必须以‘/’开头,如URL url = Demo1.class.getResource("/demo/names.ser");获取的是demo包内的names.ser文件

 

其实第二种方式是对第一种方式的一个封装,都是用的ClassLoader来加载的资源文件。为什么这么说呢?看一下Class类的源码就知道:

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;
     }

getResource根据传进来的name值(即相对路径或者绝对路径的形式),我们看到经过resolveName处理之后就调用了ClassLoader c1进行了加载,ClassLoader的加载路径的形式是不以‘/’开头的相对路径,那肯定是resolveName把路径转换了一把,再看看resolveName方法,首先判断是不是以‘/’开头,如果以‘/’开头,则为相对路径,否则就是绝对路径,注意else这个代码块,它将第一个字符去除掉了,确实去除掉之后就符合了ClassLoader的加载路径,而if块中就根据把当前类的包路径截取,然后将.替换成了'/',并添加上那段相对路径,也形成了符合ClassLoader的加载路径。

分享到:
评论

相关推荐

    java读取项目中的文件(src目录下)

    - 通常,Java项目有一个标准的目录结构,如`src/main/java`用于存放Java源代码,`src/main/resources`用于存放资源文件,如配置文件、图片或文本文件等。如果你的文件直接放在`src`目录下,可能意味着它是在源代码...

    java 读取资源文件

    在Java编程中,读取资源文件是常见的任务,特别是在配置应用程序、处理文本数据或加载本地化内容时。本文将深入探讨如何使用Java读取资源文件,特别是properties类型的文件。 资源文件通常存储在项目的类路径...

    android apk 反编译java文件对应的资源批量修改(更改为R.java文件中的R.string.name格式)

    Android的apk文件反编译后,甚多的资源和java文件无法对应,java文件中引用的资源id变成十进制数字。本文将反编译apk的java文件和资源文件重新关联引用对应,使得java文件能准确无误地重新引用资源文件。 (1)将反...

    将Java项目打包成可执行文件

    将Java项目打包成可执行文件是一项常见的需求,尤其是在部署应用程序到非开发环境时。通过将Java项目转换为可执行文件(.exe),可以方便地在Windows操作系统上运行,无需用户安装Java运行环境(JRE)。本文将详细...

    Java项目开源源码2023最新资源

    对于提供的"Java项目开源源码2023最新资源.docx"文件,这是一个可能包含项目列表、介绍或指南的文档。打开这个文档,你可以找到具体的项目链接,从而开始你的学习之旅。务必充分利用这些宝贵的资源,它们将是你成为...

    java实现的本地文件管理器,java实现文件管理系统,Java

    这个项目的目标是创建一个类似Windows资源管理器的应用,能够显示本地文件系统的内容,支持文件和目录的浏览、创建、删除、重命名等基本操作。 首先,我们需要了解Java中的核心类库`java.io`,它提供了处理输入/...

    java操作共享文件

    如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>jcifs <artifactId>jcifs <version>1.1.11 ``` 如果是非Maven项目,可以手动下载jcifs-1.1.11.jar文件并将其添加到项目的类路径中。 *...

    java 文件管理器

    总的来说,Java 文件管理器是一个综合运用了多种Java核心技术的项目,它展示了如何利用Java来构建功能完备、界面友好的桌面应用程序。对于学习Java GUI编程或文件操作的开发者来说,这是一个极好的学习资源。

    JAva资源网站大全

    以下是从给定文件中整理出的Java资源网站大全,这些网站不仅提供了丰富的学习资料,还涵盖了最新的技术动态、实践案例以及开发者社区,对Java学习者来说极为宝贵。 ### 1. Sun Developer Network (SDN) Home 网址...

    Java 读取资源文件

    - 如果你的资源文件是Java项目的一部分,你可以在类路径中直接导入它们,然后使用`getClass().getResource()`或`getClass().getResourceAsStream()`方法。 4. 文件系统访问 - 如果资源文件位于文件系统的某个位置...

    java源码 java获取音频文件 播放时长AudioDemo 2018127

    在这个项目中,开发者可以学习到如何利用Java的内置库来解析音频文件的元数据,包括音频的总播放时间。 首先,我们要关注的是`java.io`和`javax.sound.sampled`这两个Java核心包,它们提供了处理音频文件的基本功能...

    java解析DWG文件为json使用superMap

    在Eclipse中,你需要通过“项目|属性”->“Java Build Path”->“Libraries”来添加SuperMap iObjects Java提供的jar包。确保导入`com.supermap.data.jar`,这是解析DWG文件的关键库。 **运行第一个示例程序** 1....

    JAVA项目实践合集

    "JAVA项目实践合集"是一个综合性的资源集合,包含了多个Java项目的源代码和实践案例,旨在帮助学习者提升Java编程技能并了解实际项目开发过程。这个压缩包中的内容广泛,涵盖了从基础到进阶的各个层面,对于Java初学...

    java读写mpp文件的开源包

    这将解析文件中的任务、资源、日历和其他项目属性,并将它们映射到Java对象。 ```java ProjectFile projectFile = new ProjectFile(); projectFile.read(new File("path_to_your_file.mpp")); ``` 2. **访问项目...

    Java带图片项目打包Jar

    不同环境下(如开发环境与运行环境)类加载器的搜索路径可能不同,这会导致资源文件无法被正确找到。 ##### 2.2 解决方案 为了解决上述问题,我们需要采取以下步骤: 1. **确保资源文件正确放置**:确保所有图片...

    将myEclipse中的java项目发布成jar

    - **资源文件**:除了Java类文件外,还可以将资源文件(如图片、配置文件等)一起打包进JAR文件中,只需确保它们放在正确的目录下。 - **环境兼容性**:考虑目标运行环境的Java版本,确保JAR文件能够在该版本上顺利...

    使用MyEclipse将JAVA项目打包成JAR文件

    在Java开发过程中,将项目打包成JAR(Java Archive)文件是常见的操作,这有助于将源代码、资源文件和依赖库整合到一个可执行的独立文件中,方便分发和运行。MyEclipse作为一款强大的Java集成开发环境,提供了简单...

    java实战项目bin部分(15个项目)

    Java实战项目中的“bin”部分通常包含了项目的可执行文件、编译后的类文件以及相关的配置文件。这个压缩包文件的名称列表中只有一个“bin”,这可能意味着它包含了一系列项目的二进制输出目录。在Java开发中,"bin...

Global site tag (gtag.js) - Google Analytics