IO 流一般都是成对存在的, 有输入(Input)、有输出 (Output) ,是数据从一个地点到另一个地点过程;对于计算机来说文件的拷贝过程,文件的编写保存,显示功能都是使用到IO;将数据的传输过程看做一个输入输出。
Java IO,也称为BIO(Blocking IO),是Java早期提供的IO模型。它是一种阻塞式IO,即在进行IO操作时,线程会被阻塞直到IO操作完成。这里主要介绍的就是BIO模型。
IO分类:
按流向分 :
- 输入流(Input)
- 输出流(Output)
按流的处理类型分 :
- 字节流(byte)
- 字符流(char)
按流的功能来分 :
- 节点流(直接跟输入输出源交互)
- 处理流(对其他流包装的流:包装流)
字节流:
InputStream是所有字节输入流的超类,它提供了读取字节数据的基本方法。OutputStream是所有字节输出流的超类,它提供了写入字节数据的基本方法。
FileInputStream/FileOutputStream :
用于读取和写入文件的字节流。通过它们可以从文件中读取字节数据或将字节数据写入文件ByteArrayInputStream/ByteArrayOutputStream :
用于在内存中读取和写入字节数组的流。BufferedInputStream/BufferedOutputStream :
提供了带有缓冲功能的输入和输出,可以提高IO操作的效率ObjectInputStream/ObjectOutputStream :
用于读取和写入Java对象的流。它们可以将Java对象序列化为字节流,或者将字节流反序列化为Java对象- PipedInputStream/PipedOutputStream : 用于线程间通信的管道流,它们提供了一个在多个线程之间进行数据传输的机制。PipedInputStream从PipedOutputStream接收数据。
PipedOutputStream output = new PipedOutputStream(); // 订阅output PipedInputStream input = new PipedInputStream(output);
PrintStream:
字节打印流
字符流:
Reader/Writer:Reader是所有字符输入流的超类,它提供了读取字符数据的基本方法。Writer是所有字符输出流的超类,它提供了写入字符数据的基本方法。
InputStreamReader/OutputStreamWriter :
用于将字节流转换为字符流的桥接流。它们通过指定字符编码将字节数据转换为字符数据。FileReader/FileWriter :
用于读取和写入文件的字符流。通过它们可以从文件中读取字符数据或将字符数据写入文件。它们是基于FileInputStream和FileOutputStream的字符流实现。BufferedReader/BufferedWriter:
提供了缓冲区功能的字符流。它们可以提高字符流的读写效率,减少对底层系统的实际IO操作次数。CharArrayReader/CharArrayWriter:
用于读取和写入字符数组数据。PipedReader/PipedWriter:
管道流的字符流操作。PrintWriter:
字符打印流
缓冲流
缓冲流效率较普通的字符流和字节流高, 是因为在linux内核中, 只有在缓冲流写入缓冲区的信息达到一定阈值或者缓冲流刷新的时候,才会真正的往磁盘中写入信息,而普通的流,则是每次写入都会往磁盘中写入数据。缓冲流是一种自带缓冲区的流,主要由以下四种构成。
BufferedInputStream/BufferedOutputStream
:字节缓冲输入流 / 字节缓冲输出流BufferedReader/BufferedWriter
:字符缓冲输入流 / 字符缓冲输出流
转换流:
在一些需求中经常会需要将一个字节流的数据转换为字符流;又或者需要将一个字符流转换为字节流,此时就需要使用转换流来完成功能,转换流一般应用于:文件转码,从网络中读取的数据为字节流时,但是该流包含内容是字符时,可以使用转换流实现转换;java.io中转换流主要由以下两个类构成:
- InputStreamReader:用于将字节输入流转换为字符输入流(字节->字符)
- OutputStreamWriter:用于将字符输出流转换为字节输出流(字符->字节)
Java BIO、NIO、AIO:
Java 1.4开始提供了NIO(New IO,非阻塞IO)相关的类和接口,如Channel、ByteBuffer和Selector等,用于实现更高效的IO操作。1.7开始引入AIO (Asynchronous IO)异步IO模型,AIO将IO操作完全交给系统处理,无需应用程序等待IO完成。
-
Java IO(BIO):
Java IO,也称为BIO(Blocking IO),是Java早期提供的IO模型。它是一种阻塞式IO,即在进行IO操作时,线程会被阻塞直到IO操作完成。Java IO通过流的方式来进行IO操作,对应的主要类包括InputStream、OutputStream、Reader和Writer,它们是同步的,一次只能处理一个请求。在面对并发量较大的情况下,BIO模型性能较低。 -
Java NIO:
Java NIO(New IO)是Java在1.4版本中引入的新IO模型,它提供了非阻塞式IO。NIO使用了通道(Channel)和缓冲区(Buffer)的概念,数据通过通道进行传输,而Buffer用于读写操作。相对于BIO,NIO具备更高的性能和并发处理能力。核心类包括Selector、Channel和Buffer等。 -
Java AIO:
Java AIO(Asynchronous IO)是Java在1.7版本中引入的异步IO模型。AIO将IO操作完全交给系统处理,无需应用程序等待IO完成。它基于事件和回调机制,通过CompletionHandler来处理IO完成事件,可以同时处理多个IO请求。主要类包括AsynchronousSocketChannel、AsynchronousServerSocketChannel和AsynchronousFileChannel等。