Resources
Resource作为输入源
Resources最终调用的还是ClassLoaderWrapper的方法,但是ClassLoaderWrapper对外提供的方法有限,只有将路径转换为Stream和将路径转换为URL两个方法,但是这不能真正满足需求,所以Resources在外层补充了很多方法如返回Properties,返回Reader,返回File等。
1.getResourceURL 调用ClassLoaderWrapper.getResourceAsURL
2.getResourceAsStream 调用ClassLoaderWrapper.getResourceAsStream
3.getResourceAsProperties 调用ClassLoaderWrapper.getResourceAsStream new Properties().load(inputStream);
4.getResourceAsReader 调用ClassLoaderWrapper.getResourceAsStream new InputStreamReader(inputStream);
5.getResourceAsFile 调用ClassLoaderWrapper.getResourceAsURL new File(URL);
(getResourceAsFile为什么不调用ClassLoaderWrapper.getResourceAsStream呢,因为Stream没有getFile方法。哈哈哈,玩笑。Stream是封装了流的类,它的输入源可能不止是文件也有可能是网络端口,所以没有getfile方法。Stream类要抽象出所有流的特点,文件只是它的一种情况,而且还是可有可无的,所以没有啊。个人见解)
以上方法是所有本地路径下所有可以调用的方法,均有两个重载:有classloader和无classloader。
URL作为输入源
1.getUrlAsStream 调用new URL("").openConnection().getInputStream();
2.getUrlAsReader 调用new URL("").openConnection().getInputStream(); new InputStreamReader(inputStream)
3.getUrlAsProperties 调用new URL("").openConnection().getInputStream(); new Properties().load(inputStream);
URL作为输入源只有一种情况:输入为路径,输出为Stream,也不可以指定classloader。
classForName
1.其实就是Class.forName只是制定了classloader
设置Charset和修改Charset
1.getCharset
2.setCharset
get set方法不做详细介绍了。他的作用是InputStream转换为InputStreamReader的是可以执行字符集(编码),按照制定的字符集进行转换。
就是字节和字符转换的时候,举个栗子(一般情况字节转字符是两个转换成一个,有的字符集就是三个转换成一个,如果不设置编码就是经常看到的乱码)
外国的文字一般一个字符就可以存储完(就是枚举,0代表博,1代表客,2代表园)情况比较少。但是其他国家比如中国的文字一个根本就存不完,字数太多了。
ClassLoaderWrapper
ClassLoaderWrapper是读取文件资源的最终执行者,它有以下方法:
classloader数组:
classLoader 执行方法传递进来的
defaultClassLoader, 方法中没有初始化,可能他类帮他初始化了吧(可能性不大)
Thread.currentThread().getContextClassLoader(), 当前线程类的
getClass().getClassLoader(), 当前类的
systemClassLoader 系统默认的
getResourceAsURL
循环classloader的数组去加载Resource,直到返回的URL非空
getResourceAsStream
循环classloader的数组去加载Resource,直到返回的Stream非空
classForName
循环classloader的数组去加载class,直到返回的Stream非空
总结一下两个类:
Resources提供的方法 | 方法实质 | 封装过程 |
getResourceURL | ClassLoaderWrapper.getResourceAsURL | 未封装 |
getResourceAsStream | ClassLoaderWrapper.getResourceAsStream | 未封装 |
getResourceAsProperties | ClassLoaderWrapper.getResourceAsStream | new Properties().load(inputStream); |
getResourceAsReader | ClassLoaderWrapper.getResourceAsStream | new InputStreamReader(inputStream); |
getResourceAsFile | ClassLoaderWrapper.getResourceAsURL | new File(URL); |
getUrlAsStream | new URL("").openConnection().getInputStream() | 未封装 |
getUrlAsReader | new URL("").openConnection().getInputStream(); | new InputStreamReader(inputStream) |
getUrlAsProperties | new URL("").openConnection().getInputStream(); | new Properties().load(inputStream); |
classForName | ClassLoaderWrapper.classForName | 未封装 |
ClassLoaderWrapper加载类的是会将自己的classloader数组循环一边,直到加载出资源为止。