当前位置: 首页 > 图灵资讯 > 技术篇> Java四种主要的IO模型

Java四种主要的IO模型

来源:图灵教育
时间:2023-06-27 14:58:11

Java四种主要的IO模型_ide

在Java编程中,IO(Input/Output)模型是一个非常重要的概念。IO模型的作用是管理计算机读取和写入外部数据。Java中有四种IO模型,即BIO、NIO、AIO和Netty。本文将结合Java代码案例和真实项目案例,详细说明这四种IO模型的使用方法和注意事项。

1.BIO模型

BlockingI/O,阻塞式I/O。在BIO模型中,当用户线程启动系统调用时,核心会等待,直到数据可读或可写,结果才会返回。BIO模型的优点是使用简单,但存在一个显著的问题,即每个线程都会被阻塞,导致系统性能急剧下降。

Java四种主要的IO模型_ide_02

通过Socket和ServerSocket,可以在Java中使用BIO模型。以下是一个简单的BIO模型代码实现:

// 客户代码try (Socket socket = new Socket("localhost", 8080)) {    OutputStream outputStream = socket.getOutputStream();    outputStream.write("Hello World".getBytes());} catch (IOException e) {    e.printStackTrace();}// 服务端代码try (ServerSocket serverSocket = new ServerSocket(8080)) {    while (true) {        try (Socket socket = serverSocket.accept()) {            InputStream inputStream = socket.getInputStream();            byte[] bytes = new byte[1024];            int len;            while ((len = inputStream.read(bytes)) != -1) {                System.out.println(new String(bytes, 0, len));            }        } catch (IOException e) {            e.printStackTrace();        }    }} catch (IOException e) {    e.printStackTrace();}

2.NIO模型

Nonio模型全称Non-BlockingI/O,非阻塞型I/非阻塞型I/O。在NIO模型中,用户线程不会总是等待系统调用的结果,而是可以先做其他事情。当内核中的数据准备好时,用户线程将被通知操作。NIO模型的优点是可以减少线程阻塞,提高系统性能,但比BIO模型更复杂。

Java四种主要的IO模型_ide_03

在Java中使用NIO模型,通过Selectorr、实现Chanel和buffer类。以下是一个简单的NIO模型代码实现:

// 服务端代码try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {    serverSocketChannel.socket().bind(new InetSocketAddress(8080));    serverSocketChannel.configureBlocking(false);    Selector selector = Selector.open();    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);    while (true) {        selector.select();        Set selectionKeys = selector.selectedKeys();        Iterator iterator = selectionKeys.iterator();        while (iterator.hasNext()) {            SelectionKey selectionKey = iterator.next();            iterator.remove();            if (selectionKey.isAcceptable()) {                SocketChannel socketChannel = serverSocketChannel.accept();                socketChannel.configureBlocking(false);                socketChannel.register(selector, SelectionKey.OP_READ);            } else if (selectionKey.isReadable()) {                SocketChannel socketChannel = (SocketChannel) selectionKey.channel();                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);                int len;                while ((len = socketChannel.read(byteBuffer)) > 0) {                    byteBuffer.flip();                    System.out.println(new String(byteBuffer.array(), 0, len));                    byteBuffer.clear();                }            }        }    }} catch (IOException e) {    e.printStackTrace();}// 客户代码try (SocketChannel socketChannel = SocketChannel.open()) {    socketChannel.connect(new InetSocketAddress("localhost", 8080));    ByteBuffer byteBuffer = ByteBuffer.wrap("Hello World".getBytes());    socketChannel.write(byteBuffer);    byteBuffer.clear();} catch (IOException e) {    e.printStackTrace();}

3.AIO模型

4.Netty模型

Netty是一个基于NIO模型的高性能网络框架。Netty提供了一些先进的抽象和接口,使网络编程更加简单和灵活。Netty模型的优点是它可以很容易地处理复杂的网络协议,但它比AIO模型更复杂。

Java四种主要的IO模型_System_05

在Java中使用Netty模型可以通过Chanel和Eventloop类实现。以下是一个简单的Netty模型的代码实现:

// Eventloopgroup服务端代码 bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {    ServerBootstrap serverBootstrap = new ServerBootstrap();    serverBootstrap.group(bossGroup, workerGroup)            .channel(NioServerSocketChannel.class)            .childHandler(new ChannelInitializer() {                @Override                protected void initChannel(SocketChannel socketChannel) throws Exception {                    socketChannel.pipeline().addLast(new StringDecoder());                    socketChannel.pipeline().addLast(new StringEncoder());                    socketChannel.pipeline().addLast(new SimpleChannelInboundHandler() {                        @Override                        protected void chanelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {                            System.out.println(s);                            channelHandlerContext.writeAndFlush("Hello World");                        }                    });                }            })            .option(ChannelOption.SO_BACKLOG, 128)            .childOption(ChannelOption.SO_KEEPALIVE, true);    ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();    channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {    e.printStackTrace();} finally {    workerGroup.shutdownGracefully();    bossGroup.shutdownGracefully();}// 客户代码Eventlopgrop eventLoopGroup = new NioEventLoopGroup();try {    Bootstrap bootstrap = new Bootstrap();    bootstrap.group(eventLoopGroup)            .channel(NioSocketChannel.class)            .handler(new ChannelInitializer() {                @Override                protected void initChannel(SocketChannel socketChannel) throws Exception {                    socketChannel.pipeline().addLast(new StringDecoder());                    socketChannel.pipeline().addLast(new StringEncoder());                    socketChannel.pipeline().addLast(new SimpleChannelInboundHandler() {                        @Override                        protected void chanelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {                            System.out.println(s);                        }                    });                }            })            .option(ChannelOption.SO_KEEPALIVE, true);    ChannelFuture channelFuture = bootstrap.connect("localhost", 8080).sync();    channelFuture.channel().writeAndFlush("Hello World");    channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {    e.printStackTrace();} finally {    eventLoopGroup.shutdownGracefully();}

5.注意事项

在使用IO模型编程时,应注意以下几点:

尽量使用异步操作,避免堵塞操作。

在高并发条件下,线程池需要用于管理线程。

在编写网络程序时,需要考虑数据的安全性和网络协议的正确性。

使用Netty模型时,需要了解Netty一些高级抽象类和接口的使用方法。

一般来说,IO模型是Java编程中一个非常重要的概念。不同的IO模型有不同的优缺点,需要根据实际情况选择合适的模型。我希望以上内容能对你有所帮助!