字节流读取一个字节,字符流每次读取一个字符
- GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;
- UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;
- UTF-16be 编码中,中文字符和英文字符都占 2 个字节。
Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。
常见IO类:
磁盘操作:file
字节操作:InputStream outputStream
字符操作:reader writer
对象操作:序列化 serializable
网络操作:socket
5种I/O模型
- 阻塞式 I/O
进程等待内核准备好数据,完全阻塞等待,CPU释放,等待数据准备
- 非阻塞式 I/O
轮询向内核获取数据是否准备完成,内核快速返回信息,不释放CPU,一直占用
- I/O 复用(select 和 poll)
应用先向内核调用多个线程,select / poll 后,等待数据,等待套接字变为可用,此过程阻塞,当某个套接字可用时,应用调用程序进行数据读取,读取时该过程阻塞。优点是多个方法执行时,可以复用套接字(连接)
- 信号驱动式 I/O(SIGIO)
应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。内核加载数据完成后,发送信号通知应用程序,应用程序收到信号后,开始将数据复制到应用程序中。(收到信号后,通知应用程序可以进行IO操作)
- 异步 I/O(AIO)
进行 aio_read 系统调用会立即返回,应用进程继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。(应用程序异步进行IO操作,不会阻塞)