学习Java中的IO,首先要理解Java中IO的流模型。
所谓流,可以假想成河流,流的数据源,就是河流的发源地,流是单向的,流的单向性,就像河流的水流是单向的一样。

流的概念

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,
流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。


Java中流的概念细分

a.按流的方向分类:

1、输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。

2、输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。
6.IO流和文件 - 图1

b.按处理的数据单元分类:

1、字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。
2、字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。 本质其实就是基于字节流读取时,去查了指定的码表

字节流和字符流的区别:

读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

c.按处理对象不同分类:

1、节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等

2、处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。

节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性

6.IO流和文件 - 图2


Java中IO流类的体系

(1) 按操作方式分类结构图
Java IO操作.jpg

(2)按操作对象分类结构图

Java IO-按操作对象分类结构图.jpg

1、InputStream/OutputStream 字节流的抽象类。
2、Reader/Writer 字符流的抽象类。
3、FileInputStream/FileOutputStream 节点流:以字节为单位直接操作“文件”。
4、ByteArrayInputStream/ByteArrayOutputStream 节点流:以字节为单位直接操作“字节数组对象”。
5、ObjectInputStream/ObjectOutputStream 处理流:以字节为单位直接操作“对象”。
6、DataInputStream/DataOutputStream 处理流:以字节为单位直接操作“基本数据类型与字符串类型”。
7、FileReader/FileWriter 节点流:以字符为单位直接操作“文本文件”(注意:只能读写文本文件)。
8、BufferedReader/BufferedWriter 处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。
9、BufferedInputStream/BufferedOutputStream 处理流:将InputStream/OutputStream对象进行包装,增加缓存功能,提高 读写效率。
10、InputStreamReader/OutputStreamWriter 处理流:将字节流对象转化成字符流对象。
11、PrintStream 处理流:将OutputStream进行包装,可以方便地输出字符,更加灵活。

image.png

IO流使用规律总结

1)明确要操作的数据是数据源还是数据目的(要读还是要写)
      源:InputStream  Reader
      目的:OutputStream  Writer
(2)明确要操作的设备上的数据是字节还是文本
      源:
          字节:InputStream
          文本:Reader
      目的:
          字节:OutputStream
          文本:Writer
(3)明确数据所在的具体设备
      源设备:
        硬盘:文件 File开头
        内存:数组,字符串
        键盘:System.in
        网络:Socket
      目的设备:
        硬盘:文件 File开头
        内存:数组,字符串
        屏幕:System.out
        网络:Socket
(4)明确是否需要额外功能?
    需要转换——转换流 InputStreamReader OutputStreamWriter
    需要高效——缓冲流Bufferedxxx
    多个源——序列流 SequenceInputStream
    对象序列化——ObjectInputStream,ObjectOutputStream
    保证数据的输出形式——打印流PrintStream Printwriter
    操作基本数据,保证字节原样性——DataOutputStream,DataInputStream