Java I/O 是机器获取和交换信息的主要渠道,当前在这个海量数据时代,数据在网络中随处流动,这个六到的过程都涉及到I/O问题,可以说I/O问题是整个人机交互的核心问题,很多Web应用系统的瓶颈都是I/O瓶颈。
I/O 的概念:I/O 即我们所说的输入和输出,既然是输入和输出,那么肯定是一个应用程序从某个数据源进行读取,再将原始数据输出到目标媒介,下面我们看普通的数据源和媒介都有哪些:
- 文件
- 管道
- 网络连接
- 内存缓存
- System in, System out ,System.error
Java 的IO机制主要是通过java.io包下的类和接口来支持,在java.io包下主要分类如下:
- 基于字节操作:InputStream和outputStream
- 基于字符操作:Writer和Reader
- 基于磁盘操作:File
- 基于网络操作:socket(不在java.io包下)
a 和 b 主要是传输数据的数据格式,c 和 d 主要是传输数据的方式。
在Java IO 中,我们常提到“输入流”、”输出流“等概念,那么什么是流呢?所谓的流,其实就是一种抽象数据的总称,其本质是能够进行传输的。例如:键盘、文件、网络连接等,在Java中可以抽象的表述为"流"。
- 按照流的数据流向,可以将其划分为:输入流和输出流
- 按照流的处理单位,可以将其划分为:字节流和字符流,在java中,字节占1个Byte,即8位;而字符占2个Byte,即16位。同时需要注意的是,java的字节是有符号类型,而字符是无符号类型。
JAVA IO流的框架
1.以字节为单位的I/O框架图
a.InputStream 相关类
b.OutputStream 相关类
- InputStream和OutputStream :是以字节为单位的输入流和以字节为单位的输出流的超类,InputStream 提供read()接口读取字节数据,OutPutStream 提供了Write()接口从输出流中取字节数据 。
- ByteArrayInputStream和ByteArrayOutputStream :是字节数组输入流和字节数组输出流,主要是通过内部缓冲区也就是一个byte数组来实现的。
- PipleInputStream :管道输入流,必须和PipleOutStream 一起使用,实现多线程间的管道通信。
- DataInputStream和DataOutputStream : 数据输入流数和数据输出流,可以输入和输出java基本数据类型。
- FilterInputStream : 实现自定义过滤输入流,基本上仅仅只是覆盖了InputStream的所有方法,FileterOutputStream类似。
- ObjectInputStream :对象输入流,能够从输入流中读取java对象,和ObjectOutputStream 一起,用来提供对“基本数据或对象”的持久存储,注意:序列化和反序列化一个对象之前,必须实现java.io.Serializable接口。
- FileInputStream和FileOutputStream : 文件输入流和文件输出流,用于对文件进行读取和写入操作。
- BufferInputStream 和BufferOutputStream : 缓冲输入流,为输入流提供缓冲区,提供IO速度。
- PrintStream : 打印输出流,能为其他输出流添加功能。
2.以字符为单位的I/O框架图
a.Reader相关类
b.Writer相关类
- Reader和 Writer 分别是以字符为单位的输入输出流的超类,Reader提供read() 接口取字符数据,Writer提供write()接口往其中写入数据。
- BufferedReader和BufferedWriter 是字符缓冲输入、输出流,它们的作用分别是为另一个输入和输出流添加缓冲功能。
- FilterReader 和 FilterWriter 字符类型的过滤输入流和过滤输出流
- CharArrayReader 和CharArrayWriter 字符数组输入流和字符数组输出流。用于读取字符数组,操作的数据是以字符为单位。
- PipedReader 字符类型的管道输入流,和PipedWriter 一起可以通过管道进行线程间的通信。两者必须配套使用
- InputStreamReader 和OutputStreamWriter ,是字节转字符的输入流和字节转字符的输出流,它们是字节流通向字符流的桥梁:使用指定的charset将字节转换字符
- PrintWriter :字符类型的打印输出流,作用类似PrintStream.
3.字节转换为字符流的框架图:
InputStreamReader 类是字节到字符的转换桥梁,InputStream到Reader 要指定编码字符集,否则采用系统默认的字符集,很可能会出现乱码问题。StreamDecoder是完成字节到字符的解码实现类。