java.io包的传统IO流对象

一、概述

1.1OOP的实质是通过委托实例来帮我们实现计算机的功能,通过这些类来执行相应的功能。打代码的实质就是看API,熟悉API,掌握API,写API,测试API。
1.2IO流的本质就是数据流对象,也就是资源类,也就是通过这些类来表示文本文件,图片文件,视频文件,声音文件,当然还需要处理这些文件的对象才可以。所以接下来重点解释这些流能帮我们做到什么事。

二、抽象类

原理就是能够把数据拷贝放在内存中,然后我们就去处理这些字节或者字符。

InputStream

输入字节流的父类,表示外部文件输入内存的流对象,能把外部数据输入内存,也就是定义了一块内存空间,让外部数据输入这个空间。

OutputStream

输出字节流的父类,需要接收器,把数据输出到接收器去。

Reader

读取字符流父类,基础数据是字符,功能和字节流一样。

Writer

写入字符流对象。

三、抽象接口

DataInput和DataOutput

实现对基本数据类型的读写,不需要关闭。
对InputStream和OutputStream对象的封装。

ObjectInput和ObjectOutput

扩展了对象、数组、字符串的读写

四、功能接口

AutoCloseable

自动关闭文件接口,close方法将关闭文件,相当于把文件放回去。
JDK1.7以后try-with-resource将会自动关闭try()中流对象。
其中,Closeable extends AutoCloseable。

Flushable

刷新缓存到底层流,流内部的字节或字符数组就是缓存。

Serializable

序列化接口,标志接口,实现此方法才能把对象序列化为文件。

五、实体类

5.1ByteArrayInputStream和ByteArrayOutputStream

ByteArrayInputStream
以内存中字节数组为流输入端,是一种缓存的流对象
ByteArrayOutputStream
以内存中字节数组为流的接收器,输出缓存
ByteArrayInputStream和ByteArrayOutputStream都是自增长的数组,所以通常用来做缓冲区,或者别的流的底层流,最大容量Integer.MAX_VALUE-8,扩容两倍,。

5.2FileInputStream和FileOutputStream

FileInputStream,源数据是文件,读取原始字节流
FileOutputStream,接收器也是文件,写出原始字节流
FileInputStream和FileOutputStream文件读写数据流,会创建文件描述符,文件访问通道等对象,用以完成对计算机底层文件系统的交互。

5.3InputStreamReader和OutputStreamWriter

InputStreamReader将字节流转换为字符流输入到JVM,并将其解码为指定charset(有设置就用JVM的设置,没设置就默认UTF-8),读取过程中按照字符集转换为char[]。
OutputStreamWriter将字符流,转换成字节流输出到接收器
InputStreamReader和OutputStreamWriter都是里面是字符,外面是字节。这两个类是FileReader和FileWriter的父类
怎么用?字符数组编码为指定格式,以流对象写入文件中。

5.4FileReader和FileWriter

就比InputStreamReader和OutputStreamWriter多了几个构造方法
文本文件读写,也是底层字节数组转换为字符数组。

5.5PipedInputStream和PipedOutputSteam

管道流,进程间通信的一种实现方式。
原理:一个缓冲数组(默认大小1024),PipedInputStream负责读,
PipedOutputSteam负责写。通过(notifyAll,wait来实现线程间协作,数组访问互斥)
[1] https://www.jianshu.com/p/e14...

5.6FileChannel 零拷贝

[1] https://www.jianshu.com/p/258...

5.7FilterInputStream和FilterOutputStream

装饰者模式,本身只是实现了InputStream和OutputStream的方法。

5.8BufferedInputStream和BufferedOutputStream

添加了缓冲数组(大小8k)

5.9BufferedReader和bufferedWriter

缓冲数组(8k大小的缓冲数组)
[1] https://blog.csdn.net/crave_s...

5.10DataInputStream和DataOutputStream

对原始数据类型的读写

5.11StringReader和StringWriter

String的Stream封装类。
StringReader底层是String,
read()是将String中的内容复制一份返回。
StringWriter底层是StringBuffer,
write()是将字符串拼接到StringBuffer后面。

五、java.io包结构图

Java.io包.png


Winson
6 声望1 粉丝

把原本的个人笔记迁移到这里