- IO
- IO 不仅是对文件进行操作,网络编程中的Socket通信也属于IO
- 基本的流
- 输入、输出字节流:读取写入字节,由于以字节的形式读写,中文文本文件会出现编码的问题
FileInputStream
FileOutputStream
- 输入、输出字符流:读取写入字符,由于以字符的形式读写,因此支持中文字符
FileReader
FileWriter
- 输入、输出缓冲流:指定缓冲区大小,提高读取或写入的速度;避免了频繁的磁盘读写,进而提高IO的处理效率
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
- 输入、输出转换流:解决字节流的编码问题,在读写的时候可以指定编码格式
InputStreamReader
OutputStreamWriter
- 序列化、反序列化流:将对象以流的方式进行读写
ObjectOutputStream
ObjectInputStream
- 输入、输出字节流:读取写入字节,由于以字节的形式读写,中文文本文件会出现编码的问题
- IO交互方式是同步阻塞的方式,保证了线性顺序。但是在读写没有进行完之前,线程会被阻塞
- NIO
- NIO解决了同步阻塞的IO包具有的效率问题。可以使用Channel、Selector、Buffer等新特性构造可多路复用的,同步非阻塞的IO程序
- 组成部分
- Buffer:数据容器,除了
boolean
其他数据类型都有对应Buffer实现 - Channel:较之File或Socket,Channel是一种更加操作系统底层的抽象,使得NIO可以利用现代操作系统底层机制,获得特定场景下的性能优化
- Selector:同样基于底层操作系统;可以检测注册在Selector上的多个Channel中的就绪状态,从而高效管理。是NIO实现多路复用的基础
- Charset:提供Unicode字符串定义,NIO提供相应的编解码器
- Buffer:数据容器,除了
- 缺点:NIO当现有的IO请求在数据拷贝阶段,会出现资源类型过分庞大而造成线程长期阻塞,从而造成性能瓶颈> NIO 则是利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。
- AIO
- AIO引入了异步非阻塞的方式。异步IO操作,基于事件和回调机制,应用操作直接返回不会被阻塞。处理完成后,系统通知相应线程进行工作。
- ……待补充,暂时看不懂
- 补充
- 同步 v.s. 异步
- 同步和异步关注的是消息通信机制
- 同步:发出调用之后该调用返回
- 异步:发出该调用后,调用直接返回而没有调用结果;而是通过回调、状态、通知等其他方式返回结果,实现任务间的次序关系;
- 阻塞 v.s. 非阻塞
- 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
- 阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回
- 非阻塞:即使没有获得调用结果,该调用不会阻塞当前线程
- 同步 v.s. 异步
try-with-resource 语法
外部资源的句柄对象实现了AutoCloseable接口时,可以用以下模板简化书写
java public static void main(String[] args) { try (FileInputStream inputStream = new FileInputStream(new File("test"))) { System.out.println(inputStream.read()); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } }
将外部资源的句柄对象放在try关键字后面的括号中,当try-catch代码块执行完毕之后,java会确保外部资源的close方法被调用
- 常用的java.io.InputStream,java.io.OutputStream,java.io.Reader,java.io.Writer(以及其各自的子类)都实现了AutoCloseable接口