IO
IO流的分类
- 按数据方向来分:输入流(input)、输出流(output)
- 按数据单位来分:字节流(byte)、字符流(char)
- 按数据通道来分:节点流、处理流
IO类的分类
- 接口:InputStream、OutputStream、Reader、Writer
- 内存:ByteArrayInputStream、ByteArrayOutputStream、
CharArrayReader、CharArrayWriter、
StringReader、StringWriter - 文件:FileInputStream、FileOutputStream、FileReader、FileWriter
- 管道:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
- 终端:Scanner、PrintStream、PrintWriter
- 缓冲:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
- 转换:InputStreamReader、OutputStreamWriter
- 组合:SequenceInputStream
IO类的体系
- InputStream
- ByteArrayInputStream:节点流,操作内存
- FileInputStream:节点流,操作文件
- PipedInputStream:节点流,操作管道
- FilterInputStream
- BufferedInputStream:处理流,支持缓冲
- DataInputStream:处理流,操作数据
- PushbackInputStream:处理流,支持回退
LineNumberInputStream(已废弃):已废弃,推荐用LineNumberReader
- ObjectInputStream:处理流,操作对象
- SequenceInputStream:处理流,组合输入
StringBufferInputStream(已废弃):已废弃,推荐用StringReader
- OutputStream
- ByteArrayOutputStream:节点流,操作内存
- FileOutputStream:节点流,操作文件
- PipedOutputStream:节点流,操作管道
- FilterOutputStream
- BufferedOutputStream:处理流,支持缓冲
- DataOutputStream:处理流,操作数据
- PrintStream:处理流,功能丰富
- ObjectOutputStream:处理流,操作对象
- Reader
- CharArrayReader:节点流,操作内存
- StringReader:节点流,操作内存
- InputStreamReader:处理流,支持转换
- FileReader:处理流,操作文件
- PipedReader:节点流,操作管道
- FilterReader
- PushbackReader:处理流,支持回退
- BufferedReader:处理流,支持缓冲
- LineNumberReader:处理流,包含行数
- Writer
- CharArrayWriter:节点流,操作内存
- StringWriter:节点流,操作内存
- OutputStreamWriter:处理流,支持转换
- FileWriter处理流,操作文件
- PipedWriter:节点流,操作管道
- FilterWriter
- BufferedWriter:处理流,支持缓冲
- PrintWriter:处理流,功能丰富
注意:BufferedReader没有继承FilterReader,BufferedWriter没有继承FilterWriter
IO模型分类
IO模型分类
IO模型可以按照同步和异步、阻塞和非阻塞进行分类
- 同步阻塞
- 同步非阻塞
- 异步非阻塞
注意:没有异步阻塞这种组合,因为异步不需要阻塞
同步和异步
同步和异步描述的是调用者执行操作后获取结果的方式
- 同步:主动获取结果,有阻塞和非阻塞等实现方式
- 异步:被动接收结果,有回调等实现方式
非阻塞实现方式:轮询(polling)、事件驱动(event-driven)、信号驱动(signal-driven)
阻塞和非阻塞
阻塞和非阻塞描述的是调用者执行操作后的后续行为
- 阻塞:只能挂起等待结果,不能做其他事情
- 非阻塞:无需挂起等待结果,可以做其他事情,稍后再获取或者接收结果
Java的IO模型分类
- BIO(Bloking IO):同步阻塞IO,又名老IO(Old IO)
- NIO(Non-Bloking IO):同步非阻塞IO,又名新IO(New IO)
- AIO(Asynchronous IO):异步非阻塞IO
BIO和NIO的区别
- BIO的操作是阻塞的,NIO的操作是非阻塞的
- BIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的
- BIO一次只能操作一个数据源,NIO一次可以操作多个数据源
Stream和Channel的区别
- Stream是单向的(只能读或者写),Channel是双向的(既能读又能写)
Unix的IO模型分类
- 阻塞IO(bloking IO):同步阻塞IO
- 非阻塞IO(non-blocking IO):同步非阻塞IO
- 多路复用IO(multiplexing IO):同步非阻塞IO,又名事件驱动IO(event-driven IO)
- 信号驱动式IO(signal-driven IO):同步非阻塞IO
- 异步IO(asynchronous IO):异步非阻塞IO
注意:除了异步IO,其他都是同步IO,同步IO里面除了阻塞IO以外都是非阻塞IO
IO多路复用
- select
- 文件描述符个数最多只能有1024个,数量少
- 监听事件时每次都需要将所有的文件描述符拷贝到内核,开销大
- 查阅事件时每次都需要遍历所有的文件描述符,开销大
- poll
- 解决了文件描述符个数最多只能有1024个的限制
- epoll
- 解决了文件描述符个数最多只能有1024个的限制
- 监听事件时不需要将所有的文件描述符拷贝到内核
- 查阅事件时不需要遍历所有的文件描述符
C10K
Epoll
- epoll_create:创建一个epoll句柄
- epoll_ctl:注册要监听的事件
- epoll_wait:等待事件触发后处理
ps:select和poll都只提供了一个函数,而epoll提供了三个函数
- 水平触发:不断的触发epoll_wait回调,直到内核缓冲区数据被read函数读完才结束
- 边缘触发:只触发一次epoll_wait回调,需要程序自己保证将内核缓冲区的数据读取完
select和poll调用只支持水平触发,epoll默认是水平触发
边缘(edge)触发类似于电平的跳变(边沿上升和边沿下降),一般和非阻塞 I/O 搭配使用
IO并发模型
Reactor和Proactor
- Reactor:同步非阻塞IO
- Proactor:异步非阻塞IO
Reactor的核心如下
- Dispatcher:事件分发器
- Acceptor:连接事件处理器
- Handler:读写事件处理器
- Processor:业务逻辑处理器
ps:Handler和Processor可以在同一个线程里面,也可以在不同的线程里面
并发IO的实现方案
- 单进程单线程
- 单进程多线程
- 多进程单线程
- 多进程多线程
ps:单进程单线程需要使用
IO多路复用
和事件循环(EventLoop)
来实现并发IO
并发IO的处理流程
- 流程
- 绑定地址 bind
- 监听地址 listen
- 监听事件 select/poll/epoll
- 接受请求 accept
- 解析请求 读数据 read request
- 处理请求 handle
- 响应请求 写数据 write response
- 单线程模型
- 绑定地址 单线程
- 监听地址 单线程
- 监听事件 无(单线程不使用多路复用,所以单线程无此操作)
- 接受请求 单线程
- 解析请求 单线程
- 处理请求 单线程
- 响应请求 单线程
- 多线程模型
- 绑定地址 reactor线程
- 监听地址 reactor线程
- 监听事件 reactor线程
- 接受请求 reactor线程 或者 单独使用acceptor线程
- 解析请求 handler线程
- 处理请求 handler线程
- 响应请求 handler线程
IO设计模式
- 装饰器模式:FilterInputStream和FilterOutputStream
- 适配器模式:InputStreamReader和OutputStreamWriter
- 观察者模式:WatchService和Watchable
BIO
BIO:Bloking IO or Old IO
BIO原理:同步阻塞式IO,基于阻塞读写机制
BIO核心:InputStream、OutputStream、Reader、Writer
NIO
NIO:Non-Bloking IO or New IO
NIO原理:同步非阻塞IO,基于多路复用机制
NIO核心:Channel、Selector、Buffer
- FileChannel
- DatagramChannel
- ServerSocketChannel
- SocketChannel
- Selector
- SelectionKey. OP_CONNECT
- SelectionKey. OP_ACCEPT
- SelectionKey. OP_READ
- SelectionKey. OP_WRITE
- ByteBuffer
- CharBuffer
AIO
AIO:Asynchronous IO
AIO原理:异步非堵塞IO,基于异步回调机制
AIO核心:AsynchronousChannel、CompletionHandler、Buffer
- AsynchronousServerSocketChannel
- AsynchronousSocketChannel
- CompletionHandler
- ByteBuffer
- CharBuffer
File
File
Path
相对路径(Relative Path)
资源路径(Resource Path)
java
Spring
jar
工作路径(Working Path)
More
CRLF
- 制表符(\t):TAB(tab)
- 回车符(\r):CR(carriage return)
- 换行符(\n):LF(line feed)(line break)(newline)
ps:按下Enter键码时,windows输入的ASCII码是CRLF,linux和mac输入的ASCII码是LF
EOF
EOF:文件结束符(end of line)
- bol:begin of line
- eol:end of line
- bof:begin of file
- eof:end of file
- boi:begin of input
- eoi:end of input
Console
如何从控制台读取数据
使用Scanner
1 | try (Scanner s = new Scanner(System.in)) { |
如何输出数据到控制台
使用PrintStream
1 | // System.out.println("123"); |
Socket
Other
Config
配置的来源和优先级(由高到低)
- 命令行选项(Option)和参数(Argument)
- 操作系统环境变量
- 配置文件和配置中心
configuration
properties
ini
xml
json
yaml
toml
environment
cmdline
选项:option
参数:argument
Serialize
- xml
- json
- bin
- Hessian(比较早期的框架)
- MessagePack(Json格式的优化版)
- Protobuf(Google出品的框架)
- Thrift(FaceBook出品的框架)
- Avro(Hadoop的一个子项目)
- Kyro(针对java的二进制协议)
- Fct(针对java的二进制协议)
Utils
Java
Files、Paths
Apache Commons
IOUtils、FileUtils、FilenameUtils、FileSystemUtils、FileCopyUtils、SocketUtils
Google Guava
Files