Java NIO介绍

2021-01-22  本文已影响0人  小波同学

I/O 模型基本说明

BIO、NIO、AIO适用场景分析

Java BIO 基本介绍

public class BioHttpServer {

    public static void main(String[] args) throws Exception {
        // 用一个线程池处理接收到的请求
        ExecutorService executor = Executors.newFixedThreadPool(10);
        // 服务端开启8081端口
        ServerSocket serverSocket = new ServerSocket(8081);
        while (!Thread.interrupted()) {
            // 阻塞式接收请求
            final Socket socket = serverSocket.accept();
            // 每当有新的请求到来,将其放到线程池中处理
            executor.submit(() -> {
                try (
                    InputStream inputStream = socket.getInputStream();
                    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {

                    // 从inputStream中读取输入内容
                    byte[] bytes = new byte[inputStream.available()];
                    inputStream.read(bytes);

                    // 封装输出内容,并将其写到outputStream
                    writer.write(ResponseUtils.getResponse(new String(bytes, StandardCharsets.UTF_8)));
                    writer.flush();

                    // 这里需要分别关闭输入和输出,否则浏览器请求的时候会发生异常
                    // 思考1:为什么不能直接close
                    socket.shutdownInput();
                    socket.shutdownOutput();
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }
}

shutdownInput,shutdownOutput 的作用是什么?
因为socket是双向的,需要先关闭输入流,告诉客户端,我不再接收数据,然后关闭输出流,表示我的数据已经发送完毕。

Java BIO 问题分析

Java NIO 基本介绍

NIO 和 BIO 的比较

NIO 三大核心原理示意图

Selector 、 Channel 和 Buffer 的关系图(简单版)

关系图的说明:

NIO 核心 Channel
NIO 核心 Buffer

以上 Buffer 分别用于对各种基本数据类型进行支持,缺少对Boolean类型的支持;

java.nio 包基本结构

java.nio 提供了对于 NIO 系统支持的类库,该包的主要结构如下:

java.nio NIO系统的顶级包,NIO系统封装了各种类型的缓冲区
java.nio.charset 封装了字符集,并且还支持分别将字符转换为字节和
字节到编码器和解码器的操作
java.nio.charset.spi 用于提供字符集服务
java.nio.channels 用于支持通道,这些通道本质上是打开I/O连接
java.nio.channels.spi 用于支持频道服务
java.nio.file 用于提供对文件的支持
java.nio.file.spi 用于提供支持文件系统的辅助服务
java.nio.file.attribute 用于对文件属性提供的支持

Java AIO 基本介绍

AIO详解:Java新一代网络编程模型AIO原理及Linux系统AIO介绍

BIO、NIO、AIO对比表

BIO NIO AIO
IO模型 同步阻塞 同步非阻塞 (多路复用) 异步非阻塞
编程难度 简单 复杂 复杂
可靠性
吞吐量

参考:
https://www.pianshen.com/article/79261180545/

https://segmentfault.com/a/1190000022653494

上一篇 下一篇

猜你喜欢

热点阅读