《黑马程序员》 类加载文件和类加载器加载文件

来源:互联网 发布:淘宝内衣店名字大全 编辑:程序博客网 时间:2024/06/10 09:31

InputStream is=ReflectLoaderProperties.class.getClassLoader().getResourceAsStream("cn/itheima/day6313/resource/config.properties");

我们每次都是使用类得到一个类加载器然后再去加载资源
这就相当于,我们要去买可乐一样,我们去找老师,然后老师再去商店买了再卖给我们
试想一下,如果我们每天有100个人要喝可乐,老师就要去商店100次,为什么老师不自己卖
可乐,然后直接卖给我们了?

所以,Class身上也提供了方法,来加载资源文件,它的内部就是调用了getClassLoader

  Class.getResourceAsStream();  //我们只需要在参数中传递进去我们配置文件的名字即可。 不需要写上它的目录就可以了。

InputStream is=ReflectLoaderProperties.class.getResourceAsStream("config.properties");

config.properties路径没有以/开头,就表示是相对于包而言的,因为.class是相对于包而言的

我们也可以使用它的子包:
cn/itheima/day6313/resource/ce/config.properties
  如果我们的文件是放在cn/itheima/day6313/resource的子包下面在
  我们的路径可以这样写InputStream is=ReflectLoaderProperties.class.getResourceAsStream("resource/ce/config.properties");

使用类加载资源文件我们即可以使用相对路径也可以使用绝对路径

//使用绝对路径:
  只要/就表示不是相对当前的包了而是相对于classpath的根
 //我们就要从根开始写上完整的路径
//绝对路径
InputStream is=ReflectLoaderProperties.class.getResourceAsStream("/cn/itheima/day6313/resource/ce/config.properties");

如果资源文件和当前的包没有关系就使用绝对路径,从classpath的根目录开始查找,
如果资源文件和当前的包有关系就使用相对路径。

 

主要是看资源文件和当前的包有没有关系
如果有就使用相对路径

如果没有就使用绝对路径


相对路径是一个飘浮不定的东西,我们不要用它

我们使用绝对路径,如果我们文件存放在d盘,而机器的硬盘小,没有d盘

所以我们使用绝对路径,但是路径不是硬编码写出来的,而是让用户在配置文件中配置的

我们读配置文件中的路径即可。


// 获取配置文件的输入流
InputStream is = new FileInputStream(new File("config.propertites"));
// 创建一个Propertites,它等效于hashmap,里面存储的是键值对
// 它在hashmap上做了优化,它在初始化的时候可以从配置文件里面把数据给加载到内存
// 它也可以把内存中的数据给写入到配置文件中
Properties pt = new Properties();
// 设置要加载的配置文件
pt.load(is);


这种方式我们可以得到一个fileinputstream也可以得到一个fileoutputstream,如果我们要存储选项的结果,
我们要将配置文件的路径存放在用户目录,要使用文件输出流来操作,我们一定要使用绝对路径,但是文件的
路径不是硬编码出来的,而是我们通过运算得出来的。

------------------------------------------------------------------------------------------------------------------------------------

每一个.class在运行的时候都要加载到内存里面来。这个工具就是类加载器,它是在程序运行的时候,把硬盘
上的字节码文件给加载到内存。
  所以我们也可以使用类加载器。来加载资源文件。

现在我们来了解一下。 只要我们运行这个类,它的字节码就会被加载进内存.

它的作用是在classpath目录下去逐一的去查找资源文件,像在运行程序的时候,它就是在classpath目录下
逐一的去查找.class文件(因为类加载器在加载class文件的时候就是在classpath目录下一个一个去找)

示例解析:
E:\javaenhance\javaenhance\src\cn\itheima\day6313\config.properties

E:\javaenhance\javaenhance\bin\cn\itheima\day6313\config.properties

ecplise它会把源程序目录下的所有的.java文件自动给编译成.class文件(一保存后就编译)
然后给放到classpath指定的目录下去。同时它把非.class的文件,原封不动按目录结构搬到
classpath指定的目录下去。( 也是就是说我们在classpath的某个地方要有一个文件,我不需要直接
放在那个目录下,我们只需要在ecplise的源目录下放一个文件,它会自动帮我们搬过去。我们真正用的时候
是用的classpath目录下的)

InputStream is=ReflectLoaderProperties.class.getClassLoader().getResourceAsStream("config.properties");
//如果我们的资源文件是在src目录下,它会自动帮我们搬到bin目录下。我们就可以直接使用上面的方式
//我们这样写是表示直接在classpath指定的根目录下(bin目录就是classpath指定的根目录)去查找


//如果我们的资源是在指定的目录下我们就要使用绝对路径了
//如果我们的资源是在src\cn\itheima\day6313\config.properties
我们在写代码的时候就要这样写
InputStream is=ReflectLoaderProperties.class.getClassLoader().getResourceAsStream("cn\itheima\day6313\config.properties");
//即是在classpath目录逐一的去查找 就是说是从根目录下开始一个一个往下找

这种应用在我们学框架的时候应用很多.因为我们写完配置文件,我们往往是把它和类放在一起,加载类是用类加载器,加载
配置文件也是使用类加载器,我们使用这个方式是只读,没有outputstream,如果我们只读,就可以使用类加载器。
如果我们要想有输出流,就要使用fileinputstream读取资源文件和fileoutputstream将对资源文件的修改写到资源文件中。

------------------------------------------------------------------------------------------------------------------------------------
类加载文件

//使用类来加载资源文件,它其实就是调用的类加载器
//  InputStream is = ReflectLoaderProperties.class
//    .getResourceAsStream("resource/config.propertites");
  //子包使用相对路径,因为它是相对它的父的包
  //相对,是相对于当前包而言的
  
  //如果不写完整路径是相对于当前的包的
  //在路径中写了/是相当于去classpath的根目录下去查找
  
//  InputStream is=ReflectLoaderProperties.class.getResourceAsStream("resource/config.propertites");
  //这里省去父包的路径,表示resource是当前包的一个子包。
//  InputStream is=ReflectLoaderProperties.class.getResourceAsStream("config.propertites");
  //相对于当前包
//  InputStream is=ReflectLoaderProperties.class.getResourceAsStream("/cn/itheima/day6313/config.properties");
  //绝对路径一定要从/根开始,所谓的根即是从bin目录开始。因为bin目录就是classpath的根目录
//  InputStream is=ReflectLoaderProperties.class.getResourceAsStream("/config.properties");
  // /代表是根目录下
  
  // 路径以/开头表示绝对路径,不以/开头表示相对路径

 

 

0 0