新生代的垃圾回收过程
需要参考的准备数据:
《JAVA程序设计》-朱庆生、古评主编
需要参考的知识点:
字节与字符的概念
操作系统文件系统原理
JAVA内存以及磁盘读写
Java File类
笔记:
- 操作系统的对磁盘的最小操作单位是文件,每一个文件在磁盘中都是以字节的形式存在。
- Java IO需要涉及两个问题:“数据存储格式”和“数据的传输方式”。
- 为了解决IO的数据存储和传输这两个问题,Java IO提出了 “数据流(Stream)” 的概念,数据流是一组有顺序,有起点,有终点的字节集合,它是对输入和输出的总称和抽象。,这个定义很重要,强调了它是一个字节集合。
- 数据流,可以分为“输入流”和“输出流”(这个划分是设计需要,不是必须的。)
字节流与字符流
字节通常用于Java程序和外部设备通讯,用于面向机器底层的数据交互。
字符通常用于Java程序与程序间通讯,面向业务层的数据交换。
无论字节流还是字符流都是基于数据表达方式上的区别,字符归根到底也是字节的一种表现形式,字符与字节之间的转化需要编码器Decoder和解码器Encoder的支持。
字节流
InputStream
InputStream它是字节流抽象类,定义了流读取的几种对于 “字节byte” 公共操作,比如:
- read() 读取一个字节
- read(byte[] b) 读满byte[] b数组
- read(byte[] b, int off, int len) 读取len个字节到b数组中,off为读取内容的起点下标。
FileInputStream 实现了从文件系统获取文件的字节流
ObjectInputStream 实现了从输入流中获取对象字节流。
FilterInputStream 继承InputStream后实现了装饰者模式,之后扩展称其他类,比如BufferedInputStream,DataInputStream,它是输入IO的精髓。
BufferedInputStream 被它包装后的输入流在使用方式没有什么不一样,但从性能上得到了明显的提高,因为它优化流在CPU和硬盘读写速度差造成频繁阻塞等待的问题。
InputStream类图
OutputStream
输出流和输入流基本上一样。
PrintStream是基于FilterOutputStream拓展而来的,一样具备装饰者模式,它在FilterOutputStream基础上实现了类println等函数功能,System.out对象封装的就是它。
OutputStream类图
字符流
字符流通常可以分为3种:缓存装饰器,字符文件IO,装饰器拓展类
Reader
BufferedReader 是字符读取缓存,它很特别直接从Reader继承而来,而且自己实现了装饰着模式,并且以字符char为单位(BufferInputStream则是以字节byte为单位)。
FileReader 文件在文件系统中以字节单位存储,所以需要借助InputStreamReader以及Decoder解码器,才能转化为字符流。
FilterReader 只是简单的实现了装饰者模式。
Reader类图
Writer
类的关系和Reader基本一样。
PrintWriter 是字符打印函数,它很特别直接从Writer继承而来,而且自己实现了装饰着模式,并且以字符char为单位(BufferOutputStream则是以字节byte为单位)
Writer类图
- 静态成员(类变量)以及transient声明的对象成员变量不会被序列化
- java.util.Scanner 它是一个正则解析器,它可以正则处理字符串,不属于IO包。
- 由于Char字符类型在java中是占用2个字节的高级类型,类似int(byte是所有基本类型里面最低等的类型),所以没有所谓的DataWriterDataReader之类的。
- 可以序列化的对象,它所引用的对象也必须可以序列化。
- 序列化使用了反射技术,低效。而且在序列化过程中会通过反射调用构造函数创建新对象。对于单例对象,它的构造器被private了,这中破坏是不希望发生了,可以通过实现接口Serializable接口后重写private Object readResolve()函数绕开序列化的反射逻辑。这个方法在在 ObjectInputStream 类的 readOrdinaryObject(boolean unshared) 方法中invokeReadResolve()中被调用。
RandomAccessFile
- RandomAccessFile 不是文件,也不是Stream.RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。
- RandomAccessFile 实现DataInput和DataOutput接口, 直接继承Object的,不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,从头开始编写其所有的方法(大多数都是本地的)。