0%

io

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
2
3
4
5
6
try (Scanner s = new Scanner(System.in)) {
if (s.hasNextInt()) {
int v = s.nextInt();
System.out.println("value: " + v);
}
}

如何输出数据到控制台

使用PrintStream

1
2
3
// System.out.println("123");
PrintStream o = System.out;
o.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

只想买包辣条