一、java中的io
数据从内存到硬盘,通常认为是输出流,即写操作;相反,从硬盘到内存,通常认为是输入流,即读操作;这里的输入、输出是从内存的角度划分的。
Java的输入流主要有InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类
字节流和字符流
字节流和字符流区别非常简单,它们的用法几乎一样。区别在于字节流和字符流所操作的数据单元不同:字节流操作的最小单元数据是8位字节,而字符流作为最小数据单元是16为字节。
字节流主要由InputStream、OutputStream作为基类,而字符流则主要由Reader和Writer作为基类完成。
节点流和处理流
按照流的角色分,可以分为节点流和处理流。
可以从、向一个特定的IO设备,读写数据流,称为节点流,节点流常常也被常务低级流(Low Level Stream)
处理流则用于对一个已经存在的流进行连接封装,通过封装后来实现数据的读写功能。处理流称为高级流;
当用处理流的进行输入、输出时,程序并不会直接连接到实际数据源,没有和实际的输入、输出节点连接。使用处理流一个明显的好处是:只要使用相同的处理流,程序就可以采用相同的输入、输出代码来访问不同数据源,随着处理流锁包装节点流的改变,程序实际所访问的数据源也相应发生改变。
处理流的功能主要体现在两个方面:
性能提高:主要以增加缓冲方式来提高输入、输出的效率
操作的便捷: 处理流可能提供了系列便捷的方法来一次性输入、输出大批量的内容,而不是输入、输出一个或多个单位数据
处理流可以“嫁接”在任何已经存在的流的基础上,这就允许Java应用程序采用相同的代码、透明的方式来访问不同的输入、输出设备输入流。
二、java中类装载器
1、JVM的类装载就是就将包含在类文件中的字节码装载到JVM中,
这是一个过程:将.class文件转换成JVM使用的类字节码(例如string类型在编译成.class文件是UTF-8编码格式,但是在JVM中是Unicode);
在JVM中的字节码就是可执行的代码。
2、类装载器把类装入JVM中经过三个步骤:装载、链接、初始化
装载的实现方式:
a、类名.class; b、对象.getClass(); c、Class.forName("类名")
类装载器本身也是一个类:java.lang.ClassLoader是类装载器基类,同时在Class类中定义了一个getClassLoader()方法,用于返回其描述的类的类装载器对象,即返回的类型是ClassLoader。
3、一个java应用持续使用两种类型的类装载器:
(1) 根装载器(tootstrap),JVM中内嵌的一个类,用特定的操作系统的本地代码实现,不用专门的类装载器去装载,负责加载java核心包(jr.jar)文件中的类。BootstrapLoader是C++写的,java核心包中还有ExtClassLoader和AppClassLoader是java写的:
a、ExtClassLoader负责加载存放在<JAVA_HOME>/JRE/LIB/EXT目录下的jar包中的类,
b、AppClassLoader负责加载存放在<CLASSPATH>用户定义的类
(2)用户定义的转载器(user-defined)
4、在linux的命令行输入java xxx时:
1)找到JRE
2)找到JVM.dll
3)启动JVM,并进行初始化
4)产生Bootstrap Loader
5)载入ExtCLassLoader
6)载入AppClassLoader
7)加载xxx类
类加载的时候遵循一个原则:“类加载器会依类的继承体系从上至下依次加载”。
该贴被yi.liao编辑于2013-2-18 13:58:49