一文带你你搞懂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日

相关文章

  • Springboot 如何实现filter拦截token验证和跨域

    针对您的问题,我来为您详细讲解Spring Boot如何实现filter拦截token验证和跨域。 一、使用Filter拦截Token验证 1. 引入相关依赖 在pom.xml文件中引入以下相关依赖: <dependencies> <dependency> <groupId>org.springframework.boot…

    Java 2023年5月20日
    00
  • 关于Java类的构造方法详解

    关于Java类的构造方法详解 类是Java的基本元素,而构造方法则是在创建类的实例时执行的一种特殊方法。本文将详细介绍Java类构造方法的相关知识以及使用技巧。 构造方法的定义 构造方法是一种特殊的方法,它的目的是在创建类的实例时执行一些初始化操作。一般情况下,构造方法和类的名称相同,不过它们没有返回值类型。在创建类的实例时,编译器会自动选择相应的构造方法并…

    Java 2023年5月26日
    00
  • SpringBoot万字爆肝高级配置

    SpringBoot万字爆肝高级配置攻略 本攻略将介绍SpringBoot的高级配置方式,包括: 自定义Starter 自定义Actuator Endpoint 自定义Health Indicator 自定义配置项 使用自定义注解 使用AOP实现统一异常处理 在本攻略中,我们将使用两个示例来详细介绍这些高级配置方式。下面分别介绍这两个示例。 示例1:自定义S…

    Java 2023年5月15日
    00
  • java 代码中预防空指针异常的处理办法

    预防空指针异常是Java编程中非常重要的一个问题。在编写Java应用程序时,空指针异常是一个常见的错误。空指针异常的出现,往往会导致程序崩溃,给用户带来不好的用户体验。因此,针对空指针异常需要特别小心来处理。本文将会向你详细介绍在Java代码中预防空指针异常的几种处理办法。 1. 开发过程中避免使用空指针 在Java程序中,空指针异常最常见的情况是试图访问一…

    Java 2023年5月27日
    00
  • Java常用的八种排序算法与代码实现

    Java常用的八种排序算法与代码实现 在Java中,排序算法是非常重要的基础知识,掌握常用排序算法不仅可以提高程序员的知识水平,也可以在以后的工作中提高效率。本文将详细讲解八种Java常用排序算法的原理和代码实现。 冒泡排序(Bubble Sort) 冒泡排序也是常用的排序算法之一,其基本思想是通过比较两个相邻的元素,如果他们的顺序不对则交换他们直至序列变得…

    Java 2023年5月18日
    00
  • Spring Security整合CAS的示例代码

    下面是我对于Spring Security整合CAS的示例代码的攻略: 前置知识 在开始讲解Spring Security整合CAS的示例代码之前,需要先了解以下几个概念: CAS (Central Authentication Service) CAS是一个单点登录协议,可以让用户在多个Web应用中进行统一认证和授权。对于用户进行登录的请求,CAS服务会将…

    Java 2023年5月20日
    00
  • Spring Security保护用户密码常用方法详解

    Spring Security保护用户密码常用方法详解 前言 在现代的Web开发中,安全性已经成为一个重要的问题。尤其是涉及到用户密码的相关处理,更是需要严格保护。 Spring Security是一个开源的Web安全框架,它提供了一些集成化的解决方案,可以快速、轻松地保护我们的应用程序的安全。这篇文章将介绍Spring Security保护用户密码的一些常…

    Java 2023年5月20日
    00
  • Java System.setProperty()用法详解

    Java System.setProperty()用法详解 什么是Java System.setProperty()? Java中的System类可以让我们与系统进行交互。其中System.setProperty()方法可以被用来在运行时设置系统属性。这个方法的语法为: public static String setProperty(String key,…

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