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