1.Java IO 模型:
Java
支持三种网络编程模型:BIO
、NIO
、AIO
。
BIO
:同步并阻塞(传统阻塞型)
服务器实现模式为一个连接一个线程,及客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。
连接数目较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。
NIO
:同步非阻塞
服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到有连接的I/O请求就进行处理。
NIO
适用于连接数目较多且比较短(微操作)的架构,比如聊天服务器,弹幕系统,服务器间通信等,编程比较复杂。
AIO
:异步非阻塞
异步非阻塞,AIO
引入异步通道的概念,采用了Proactor
模式,简化了程序编写,有效的请求才启动线程,它的特点是由操作系统完成之后才通知服务端程序启动线程去处理,一般适用于连接数量较多且连接事件较长的应用。
AIO
使用场景:连接数目多且比较长(重操作)的架构,比如相册服务器,充分调用OS
参与并发操作,编程比较复杂,JDK7
开始支持。
2.BIO 模型概述:
IO
流,是Java
存储和读取数据的解决方案。输入(Input)
和输出(Output)
的对象是针对于内存来确定的。
- 输入(
Input
):从磁盘输入到内存。 - 输出(
Output
):从内存输出到磁盘。
- 纯文本文件:能用
Windows
打得开并且能读懂的就是纯文本文件。
I/O
技术是非常实用的技术,用于处理设备之间的数据传输。读写文件、网络通讯等。Java
程序中,对于数据的输入/输出操作以“流(Stream
)”的方式进行。java.io
包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或者输出数据。
Java
的IO
流一共涉及40多个类,都是从以下4个抽象基类派生出来。由这4个派生出来的子类名称都是以其父类名作为子类名后缀。
(抽象基类) |
字节流 |
字符流 |
输入流 |
InputStream |
Reader |
输出流 |
OutputStream |
Write |
Java
中BIO
相关的输入输出流分类大致如下:
分类 |
字节输入流 |
字节输出流 |
字符输入流 |
字符输出流 |
抽象基类 |
InputStream |
OutputStream |
Reader |
Writer |
访问文件 |
FileInputStream |
FileOutputStream |
FileReader |
FileWriter |
访问数组 |
ByteArrayInputStream |
ByteArrayOutputStream |
CharArrayReader |
CharArrayWriter |
访问管道 |
PipedInputStream |
PipedOutputStream |
PipedReader |
PipedWriter |
访问字符串 |
StringReader |
StringWrite |
||
缓冲流 |
BufferedInputStream |
BufferedOutputStream |
BufferedReader |
BufferedWriter |
转换流 |
InputStreamReader |
OutputStreamWriter |
||
对象流 |
ObjectInputStream |
ObjectOutputStream |
||
抽象基类 |
FilterInputStream |
FilterOutputStream |
FilterReader |
FilterWriter |
打印流 |
PrintStream |
PrintWriter |
||
推回输入流 |
PushbackInputStream |
PushbackReader |
||
特殊流 |
DataInputStream |
DataOutputStream |
Java
BIO
分类:
按照处理流的方式:
- 节点流:如果流封装的是某种特定的数据源,如文件、字符串、字符串数组等,则称为节点流
- 处理流:如果流封装的是其他的流对象,称之为处理流。处理流提供缓冲功能,提高读写效率
按照操作数据单位:
- 字节流(8bit):传输图片、视频等文件时使用......
- 字符流(16bit):传输文本文件时使用
按照数据流的流向:
- 输入流:从磁盘、网络、键盘等读到内存,就是输入流
- 输出流:从内存写出,写到磁盘、网络、屏幕等,都是输出流