1. Java IO流的分类
Java的IO流主要分为以下几种:
(1)按数据单位分类
- 字节流:以字节(8位)为单位进行数据传输,适合处理二进制数据(如图片、视频等)。
- 字节输入流:
InputStream
(抽象类)- 常见实现类:
FileInputStream
、ByteArrayInputStream
、BufferedInputStream
。
- 常见实现类:
- 字节输出流:
OutputStream
(抽象类)- 常见实现类:
FileOutputStream
、ByteArrayOutputStream
、BufferedOutputStream
。
- 常见实现类:
- 字节输入流:
- 字符流:以字符(16位)为单位进行数据传输,适合处理文本数据。
- 字符输入流:
Reader
(抽象类)- 常见实现类:
FileReader
、BufferedReader
、InputStreamReader
。
- 常见实现类:
- 字符输出流:
Writer
(抽象类)- 常见实现类:
FileWriter
、BufferedWriter
、OutputStreamWriter
。
- 常见实现类:
- 字符输入流:
(2)按流向分类
- 输入流:从数据源读取数据。
- 例如:
InputStream
、Reader
。
- 例如:
- 输出流:向目标写入数据。
- 例如:
OutputStream
、Writer
。
- 例如:
(3)按功能分类
- 节点流:直接操作数据源或目标。
- 例如:
FileInputStream
、FileReader
。
- 例如:
- 处理流:对节点流进行包装,提供额外的功能(如缓冲、转换等)。
- 例如:
BufferedInputStream
、BufferedReader
。
- 例如:
2. NIO、AIO、BIO的区别
(1)BIO(Blocking I/O,同步阻塞IO)
- 特点:同步阻塞模式,每个连接需要一个独立的线程处理,适合连接数较少的场景。
- 缺点:线程开销大,不适合高并发场景。
- 示例:
try (ServerSocket serverSocket = new ServerSocket(8080)) { while (true) { Socket socket = serverSocket.accept(); // 阻塞 new Thread(() -> { // 处理请求 }).start(); } }
(2)NIO(Non-blocking I/O,同步非阻塞IO)
- 特点:同步非阻塞模式,使用多路复用器(Selector)管理多个通道(Channel),适合高并发场景。
- 核心组件:
- Channel:数据传输通道,例如
FileChannel
、SocketChannel
。 - Buffer:数据缓冲区,例如
ByteBuffer
。 - Selector:多路复用器,监听多个通道的事件。
- Channel:数据传输通道,例如
- 示例:
try (ServerSocketChannel serverChannel = ServerSocketChannel.open(); Selector selector = Selector.open()) { serverChannel.bind(new InetSoc