一文带你你搞懂Java的3种IO模型

一文带你搞懂Java的3种IO模型

在Java中,输入输出操作是很常见的。Java的IO模型可以分为三种:Blocking IO、Non-blocking IO和异步IO。它们的区别在于处理IO事件的方式不同。

Blocking IO

在Blocking IO模型中,当向Socket写入数据时,线程会阻塞,直到数据被真正写入。而当Socket读取数据时,线程也会阻塞,直到数据被真正读取。

Blocking IO模型的示例:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class BlockingIOServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            // 阻塞读取数据
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
                // 阻塞写入数据
                os.flush();
            }
            socket.close();
        }
    }

}

Non-blocking IO

在Non-blocking IO模型中,当向Socket写入数据时,线程不会阻塞,而是继续执行自己的任务。当数据真正写入后,会通知应用程序。当Socket读取数据时,也不会阻塞,而是立即返回一个状态信息,告诉应用程序是否有数据可读。

Non-blocking IO模型的示例:

import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
import java.nio.ByteBuffer;
import java.util.Iterator;
import java.io.IOException;

public class NonBlockingIOServer {

    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new java.net.InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);
        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            int numOfSelectedKeys = selector.select();
            if (numOfSelectedKeys > 0) {
                Iterator it = selector.selectedKeys().iterator();
                while (it.hasNext()) {
                    SelectionKey key = (SelectionKey)it.next();
                    if (key.isAcceptable()) {
                        ServerSocketChannel sc = (ServerSocketChannel)key.channel();
                        SocketChannel clientChannel = sc.accept();
                        clientChannel.configureBlocking(false);
                        clientChannel.register(selector, SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        SocketChannel clientChannel = (SocketChannel)key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(1024);
                        clientChannel.read(buffer);
                        buffer.flip();
                        clientChannel.write(buffer);
                    }
                    it.remove();
                }
            }
        }
    }

}

Async IO

在Async IO模型中,当向Socket写入数据时,线程会立即返回,不会阻塞,而是将数据存储到缓存中。当数据被真正写入后,操作系统会通知应用程序,告诉它数据已写入。当Socket读取数据时,也不会阻塞,而是立即返回,当数据被真正读取到缓存后,操作系统会通知应用程序。

Async IO模型需要使用Java NIO 2.0提供的AsynchronousChannel或CompletableFuture等API进行开发。

关于Async IO模型的示例,由于篇幅所限,本文不再进行详细说明,读者可以自行查找相关资料进行学习。

总结

本文介绍了Java的三种IO模型:Blocking IO、Non-blocking IO和异步IO,并给出了每种IO模型的示例说明。阅读本文后,希望读者可以更好地理解Java中的IO操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你你搞懂Java的3种IO模型 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Java中的异常处理用法及其架构和使用建议

    Java中的异常处理用法及其架构和使用建议 异常处理用法 Java中的异常处理用于处理程序中出现的错误和异常情况。它可以让程序在出现问题时进行清晰的错误提示,从而防止程序异常崩溃。Java中的异常处理分为两种类型:Checked Exception和Unchecked Exception。 Checked Exception Checked Exceptio…

    Java 2023年5月27日
    00
  • 将java中的 string 类型转成 数组案例

    下面是将Java中的String类型转换成数组的完整攻略。 1. 将String类型转成char数组 可以通过toCharArray()方法将String类型转成char数组。该方法会将String类型转换成char类型的数组,所以我们可以直接使用。 String str = "hello"; char[] charArray = str…

    Java 2023年5月26日
    00
  • Java String之contains方法的使用详解

    Java String 之 contains 方法使用详解 在 Java 中,String 类是最常用的类之一,而 String 类的 contains 方法则是其中常用的方法之一。本篇文章详细讲解了 Java String 类的 contains 方法使用的注意点以及示例演示。 contains 方法的作用 contains 方法的作用是判断某个字符串是否…

    Java 2023年5月26日
    00
  • 基于Java创建一个订单类代码实例

    以下是基于Java创建一个订单类的完整攻略过程: 1. 定义订单类 在创建订单类之前,需要先明确订单类需要存储哪些信息,例如订单编号、订单创建时间、订单金额等等,再根据这些信息定义订单类的属性。同时,还需要定义订单类的基本行为,例如添加商品到订单、计算订单总金额等等,并将这些功能定义为订单类的方法。 public class Order { private …

    Java 2023年5月23日
    00
  • Java的项目构建工具Maven的配置和使用教程

    Java的项目构建工具Maven的配置和使用教程 简介 Maven是一款基于项目对象模型(POM)的构建工具,用于项目的构建、依赖管理和发布。本文将详细介绍如何配置和使用Maven。 安装 下载Maven。可以从官方网站https://maven.apache.org/下载最新版本。 安装Maven。 Windows:将下载的二进制文件解压至任意目录,设置系…

    Java 2023年5月20日
    00
  • spring security结合jwt实现用户重复登录处理

    实现用户重复登录处理的一种常用方法是结合Spring Security和JWT的认证机制。下面是实现该方法的详细攻略,包括两个示例。 准备工作 首先,需要在Spring Boot项目中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <a…

    Java 2023年5月20日
    00
  • JAVA对称加密算法PBE定义与用法实例分析

    JAVA对称加密算法PBE定义与用法实例分析 简介 PBE(Password Based Encryption)是基于密码的加密算法,在数据加密中使用口令替代了传统的密钥,是一种轻量级加密算法。PBE算法不需要证书链和公钥证书等机构,实现简单便捷,容易实施。PBE算法又称为基于口令加密。 PBE算法加密实现步骤 1.搜集用户输入 从用户输入中获取需要加密的数…

    Java 2023年5月19日
    00
  • Java 如何实现照片转化为回忆中的照片

    要实现将现有照片转化为回忆中的照片,可以考虑使用 Java 中的图像处理库,例如 Java Advanced Imaging (JAI)。下面是实现该过程的具体攻略: 准备工作 首先需要在项目中引入 Java Advanced Imaging API。JAI 支持的文件格式包括 JPEG、BMP、PNG、TIFF 等常见的图片格式。如果需要支持其他格式,可以…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部