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

浅析类加载器的方式管理资源和配置文件

阅读更多

资源文件resource通常的加载方式,用类加载器的方式管理资源和配置文件;

示例要用到的文件:
资源文件:config.properties 里面只有一行语句:
className=java.util.ArrayList
java
代码
:
package com.itsoft;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;

public class ReflectFrame {

public static void main(String[] args) throws Exception {
    InputStream ipStream = new FileInputStream("config.properties");
    Properties props = new Properties();
    props.load(ipStream);
    ipStream.close();
    String className = props.getProperty("className");//

    Collection collection = (Collection) Class.forName(className).newInstance();
    collection.add("
框架反射
");
    collection.add("
资源文件
");
    collection.add("
类加载器
");
    System.out.println(className);//
输出:
java.util.ArrayList
    System.out.println(collection);//
输出:[框架反射, 资源文件, 类加载器
]
}
}

分析:上述代码用想运行不出错,那么config.properties必须放到工程根目录下面,此时它是一个相对路径,
但是我们发布程序时,会发现,工程根目录下面的这个配置文件是不会发布到tomcat中的,所以实际应用中,
这种做法是不可取的。

针对上述问题,有如下解决方法:
1.
使用绝对路径:如: InputStream ipStream = new FileInputStream("F:\\workspace\\webtest\\config.properties");
注:如果要应用这种绝对路径的方法,那么一定要记住用完整的路径不是硬编码,而是运算出来的。

2.使用类加载器:
原理:我们知道,每一个class文件运行的时候都必须加载到内存中,这个功能由类加载器来提供,
既然class文件它可以加载,那么其他资源文件,当然也可以由它来加载。
类加载器加载的时候,当然是从classpath的根目录路径下开始寻找并加载文件;

1)我们把config.properties文件和ReflectFrame.java放在同一目录下时:
   InputStream ipStream = ReflectFrame.class.getClassLoader().getResourceAsStream("com/itsoft/config.properties");
注意:这样用法相对于classpath,所以com/itsoft/config.properties前面不需要多余的在加一个"/";这种方式的过程就是首先
找到ReflectFrame这个类,然后通过该类找到它的加载器,再由类加载器去加载资源文件,那么我们能不能找到一个更直接的方法
又这个类去找到相关的资源文件呢?当然可以,看下面的例子,类加载器的简化形式;

2)config.properties文件和ReflectFrame.java依旧位于同一目录下:
InputStream ipStream = ReflectFrame.class.getResourceAsStream("config.properties");
注:这种做法此时用的是相对路径的形式,它是相对于class本身的;

3)config.properties位于com.itsoft.resource包下时:
InputStream ipStream = ReflectFrame.class.getResourceAsStream("resource/config.properties");
注:同2,这种做法此时用的是相对路径的形式,它是相对于class本身的;

4)config.properties位于com.itsoft.resource包下时:
InputStream ipStream = ReflectFrame.class.getResourceAsStream("/com/itsoft/resource/config.properties");
注:它也可以用绝对路径

小结:
1.
IO流的方式读写文件,通常是用绝对路径,但是为了通用性,这个绝对路径通常不要硬编码,而是运算出来的。
2.
类加载器在各种框架中普遍应用,无论是直接的加载(1),还是简化的加载(234),它们的本质都是ClassLoader
3.
简化的类加载器可以使用相对路径,也可以使用绝对路径。


代码(当资源文件位于不同的位置时的写法)
   //InputStream ipStream = new FileInputStream("F:\\workspace\\webtest\\config.properties");
   //InputStream ipStream = new FileInputStream("config.properties");
   //InputStream ipStream = ReflectFrame.class.getClassLoader().getResourceAsStream("com/itsoft/config.properties");
   //InputStream ipStream = ReflectFrame.class.getResourceAsStream("config.properties");
   //InputStream ipStream = ReflectFrame.class.getResourceAsStream("resource/config.properties");
   //InputStream ipStream = ReflectFrame.class.getResourceAsStream("/com/itsoft/resource/config.properties");

 

 

分享到:
评论

相关推荐

    马晓槟-浅析分散加载.pdf

    在项目中实现分散加载时,还需要考虑到链接过程的参数配置,确保链接器能够正确理解和应用加载脚本中定义的规则。此外,由于分散加载涉及到程序的内存布局,因此在程序中进行动态内存分配和管理时也需要特别注意,...

    浅析ClassLoader

    2. 类加载器分类:Java中的ClassLoader有三种基本类型:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClassLoader(应用程序类加载器)。Bootstrap加载JDK核心库,Extension...

    Linux内核配置系统浅析

    `grub config`则是在GRUB引导加载器中进行配置,主要用于修复或调整启动选项。 在配置过程中,用户会看到一系列的“配置项”,包括“Yes”、“No”、“M”(编译为模块)等选项。选择“Yes”意味着该功能将被编入...

    浅析linux下apache服务器的配置和管理

    1. 文本模式(终端命令行) - 通过直接编辑配置文件,如`httpd.conf`,进行自定义配置,这种方式更加灵活,但需要对配置语法有深入了解。 2. 图形化配置 - 提供一个图形化的界面,使得配置过程更直观,适合初学者,...

    MTK平台CAMERA驱动浅析

    - **初始化阶段**:加载驱动并初始化硬件资源。 - **配置阶段**:根据需求设置Sensor的工作参数。 - **捕获阶段**:获取图像数据。 - **处理阶段**:对图像数据进行处理或编码。 - **传输阶段**:将处理后的数据发送...

    浅析wlan驱动和sd卡硬件绑定的简单流程.rar

    8. **资源管理**:驱动程序需管理硬件资源,如内存缓冲区、中断请求线、DMA通道等,确保高效、安全地使用硬件。 通过以上流程,我们可以理解wlan驱动和sd卡硬件在Linux系统中的工作原理。这种绑定不仅涉及驱动程序...

    防止内存溢出浅析

    尽量减少大对象的使用,或者使用高效的加载和缓存策略。例如,对于位图,可以使用BitmapFactory.Options的inSampleSize来降低图片分辨率,减少内存占用。 3. **使用弱引用和软引用**: WeakReference和...

    struts运行流程浅析(适合初学者参考)

    **Struts的测试挑战**:Struts的一个缺点是测试相对复杂,因为很多逻辑分布在配置文件和多个组件中。因此,编写配置文件时需要格外小心,避免因小差错引发项目错误。 通过以上步骤,你可以理解Struts框架如何接收、...

    参考资料-基于proteus和keil+c的单片机仿真技术浅析.zip

    单片机仿真技术是电子工程领域...文件详细讲解了配置环境、编写代码、建立仿真模型以及调试技巧等步骤,是一份宝贵的自学和教学材料。无论你是单片机新手还是经验丰富的工程师,都能从中受益,提升你的单片机仿真技能。

    浅析Linux嵌入式系统软件的开发方法.pdf

    常见的引导加载器有U-Boot和BusyBox,它们处理CPU设置、内存检测和设备初始化等工作。 2. **操作系统内核**:嵌入式Linux的内核是系统的核心,负责调度任务、管理内存、处理中断以及与硬件交互。开发者可以选择裁剪...

    Android 热修复 Tinker 接入及源码浅析.rar_Android 热修复 Tinker_android

    5. **PatchClassLoader**: 补丁类加载器,用于加载补丁包中的类,实现了双亲委托模型,确保优先加载补丁包中的类。 6. **DiffUtil**: 补丁计算工具,用于计算两个APK间的差异,生成补丁文件。 **运行时流程** 1. ...

    浅析单片机计数器系统设计.pdf

    Keil软件是一个集成开发环境,它包含了编译器、库管理和仿真调试器等。 2. 计数器设计 在单片机计数器系统设计中,计数器用于统计外部事件发生的次数。计数器可以是软件实现的,也可以是硬件实现的。在硬件实现中,...

    浅析Spring Boot中的spring-boot-load模块

    它提供了三种类启动器:`JarLauncher`、`WarLauncher`和`PropertiesLauncher`,它们的主要目的是加载JAR内的资源,包括类文件和配置文件。 ### 1. 类启动器 - **JarLauncher**:主要针对JAR文件的应用,会查找当前...

    Struts2入门教程.pdf

    - **配置文件**:Struts2通过XML配置文件来管理应用的行为,如Action映射、拦截器配置等。这使得开发者可以更加灵活地管理和配置框架行为。 - **Action配置**:在Struts2中,Action是处理用户请求的核心组件。通过...

    RASP攻防 —— RASP安全应用与局限性浅析.pdf

    从技术实现角度来看,RASP可以通过预加载的方式在PHP语言中实现,例如作为PHP解释器的扩展,是一个动态库.so文件。它与PHP的其他动态库一样,集成在PHP解释器中,利用PHP的扩展机制进行加载和运行。在RASP的实现中,...

Global site tag (gtag.js) - Google Analytics