JAVA BIO

新生代的垃圾回收过程

需要参考的准备数据:

《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和硬盘读写速度差造成频繁阻塞等待的问题。

继承
继承
继承
继承
继承
FilterInputStream
抽象类InputStream
FileInputStream
ObjectInputStream
BufferedInputStream
DataInputStream

InputStream类图

OutputStream
输出流和输入流基本上一样。
PrintStream是基于FilterOutputStream拓展而来的,一样具备装饰者模式,它在FilterOutputStream基础上实现了类println等函数功能,System.out对象封装的就是它。

继承
继承
继承
继承
继承
继承
FilterOutputStream
抽象类OutputStream
FileOutputStream
ObjectOutputStream
BufferedOutputStream
DataOutputStream
PrintStream

OutputStream类图

字符流

字符流通常可以分为3种:缓存装饰器,字符文件IO,装饰器拓展类

Reader
BufferedReader 是字符读取缓存,它很特别直接从Reader继承而来,而且自己实现了装饰着模式,并且以字符char为单位(BufferInputStream则是以字节byte为单位)。
FileReader 文件在文件系统中以字节单位存储,所以需要借助InputStreamReader以及Decoder解码器,才能转化为字符流。
FilterReader 只是简单的实现了装饰者模式。

继承
继承
继承
继承
BufferedReader
抽象类Reader
InputStreamReader
FileReader
过滤器FilterReader

Reader类图

Writer

类的关系和Reader基本一样。
PrintWriter 是字符打印函数,它很特别直接从Writer继承而来,而且自己实现了装饰着模式,并且以字符char为单位(BufferOutputStream则是以字节byte为单位)

继承
继承
继承
继承
继承
BufferedWriter
抽象类Writer
OutputStreamWriter
FileWriter
过滤器FilterWriter
PrintWriter

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类中已经存在的任何功能;它是一个完全独立的类,从头开始编写其所有的方法(大多数都是本地的)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值