java NIO 详解

Java NIO 详解

Java NIO(New IO)是一种基于缓冲区、非阻塞IO的API集,主要用于替代传统的Java IO API。它可以更高效地处理IO数据,具有更好的扩展性和灵活性,尤其适用于处理大量连接和请求的场景。

在本文中,我们将从以下几个方面对Java NIO进行详细讲解:

  1. 缓冲区(Buffer)及其操作
  2. 通道(Channel)及其操作
  3. 选择器(Selector)及其操作
  4. NIO示例:服务端
  5. NIO示例:客户端

1. 缓冲区(Buffer)及其操作

缓冲区在Java NIO中是一个重要的概念,它用于存储IO数据。我们可以使用Java NIO的缓冲区来读取或写入数据。

1.1 缓冲区类型

Java NIO中主要有以下四种类型的缓冲区:
- ByteBuffer
- CharBuffer
- ShortBuffer
- DoubleBuffer

它们分别对应Java的基本类型byte、char、short和double。在实际使用中,我们通常使用ByteBuffer。

1.2 缓冲区操作

下面是一些常用的缓冲区操作:
- 分配缓冲区:ByteBuffer buffer = ByteBuffer.allocate(1024);
- 写数据到缓冲区:buffer.put("hello world".getBytes());
- 读取数据到缓冲区:buffer.get();
- 设置缓冲区起始位置:buffer.rewind();
- 清空缓冲区:buffer.clear();

2. 通道(Channel)及其操作

通道(Channel)是Java NIO中另一个重要的概念,它用于在缓冲区和IO设备之间传输数据。

通道有以下两种类型:
- FileChannel:用于文件IO的通道
- SocketChannel:用于网络IO的通道

2.1 通道操作

下面是一些常用的通道操作:
- 获取通道:FileChannel channel = new FileInputStream("file.txt").getChannel();
- 向通道写入数据:channel.write(buffer);
- 从通道读取数据:channel.read(buffer);
- 关闭通道:channel.close();

3. 选择器(Selector)及其操作

选择器(Selector)用于处理多个通道的IO操作,以便实现高效地处理大量连接和请求。

3.1 选择器操作

以下是一些常用的选择器操作:
- 打开选择器:Selector selector = Selector.open();
- 向选择器注册通道:channel.register(selector, SelectionKey.OP_READ);
- 选择已经准备好IO操作的通道:int readyChannels = selector.select();
- 处理已经准备好IO操作的通道:Set<SelectionKey> selectedKeys = selector.selectedKeys();

4. NIO示例:服务端

下面是一个简单的Java NIO服务端示例代码。该服务端接收客户端的连接,并返回客户端发送的数据。我们可以使用telnet测试该服务端的运行效果。

public class NIOServer {
    public static void main(String[] args) throws Exception {
        Selector selector = Selector.open();
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress("localhost", 8888));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            int readyChannels = selector.select();
            if (readyChannels <= 0) {
                continue;
            }
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            for (SelectionKey selectionKey : selectionKeys) {
                if (selectionKey.isAcceptable()) {
                    ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
                    SocketChannel socketChannel = server.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (selectionKey.isReadable()) {
                    SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    StringBuilder sb = new StringBuilder();
                    while (socketChannel.read(buffer) > 0) {
                        buffer.flip();
                        sb.append(Charset.defaultCharset().decode(buffer));
                        buffer.clear();
                    }
                    System.out.println("Received message: " + sb.toString());
                }
            }
            selectionKeys.clear();
        }
    }
}

5. NIO示例:客户端

下面是一个简单的Java NIO客户端示例代码。该客户端连接到上述服务端,并发送数据给服务端。

public class NIOClient {
    public static void main(String[] args) throws Exception {
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8888));
        socketChannel.configureBlocking(false);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        buffer.put("hello world".getBytes());
        buffer.flip();
        socketChannel.write(buffer);
        buffer.clear();
        socketChannel.close();
    }
}

以上是Java NIO的详解和示例代码,希望对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java NIO 详解 - Python技术站

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

相关文章

  • jQuery is not defined 错误原因与解决方法小结

    以下是 “jQuery is not defined 错误原因与解决方法小结” 的完整攻略。 1. jQuery is not defined错误原因 当在代码中使用jQuery库时,经常会出现”jQuery is not defined” 的错误提示。这种情况通常是由以下原因引起的: jQuery库没有被正确加载。 jQuery库加载顺序不正确。 jQue…

    JavaScript 2023年5月18日
    00
  • JS Array创建及concat()split()slice()的使用方法

    JS Array创建及concat()split()slice()的使用方法 1. JS Array创建 JS中创建数组有两种方式:使用数组字面量和使用Array 构造函数。下面是两种方式的定义方法。 1.1 使用数组字面量: var fruits = ["apple", "banana", "orange&…

    JavaScript 2023年5月27日
    00
  • JS使用post提交的两种方式

    JS使用post提交的两种方式: 方式一:通过XMLHttpRequest对象进行post提交 步骤如下: 1.创建XMLHttpRequest对象 2.设置请求参数 请求参数包括 type – 请求方法(GET或POST) url – 指定服务器地址 async – 是否同步请求(true或false) data – 发送的数据 3.发送请求 4.监听响应…

    JavaScript 2023年5月19日
    00
  • JS Map 和 List 的简单实现代码

    当我们在使用JavaScript的时候,有时候需要使用一些数据类型来进行操作和处理。在这些数据类型中,Map和List就是两个常用的数据类型之一。 什么是Map和List 在JavaScript中,Map是一种用于存储键值对的集合。Map中的键可以是任意类型的值,如字符串、数字甚至是对象,同样的值可以对应于不同的键。而List则是一种由一列元素组成的有序集合…

    JavaScript 2023年6月10日
    00
  • yii form 表单提交之前JS在提交按钮的验证方法

    当我们在 Yii 的视图中使用表单时,我们可能需要对用户输入的数据进行验证,以确保它们符合我们的要求。为了达到这个目的,我们可以使用客户端 JavaScript 在提交表单之前对数据进行验证。下面是如何在 Yii 框架中使用 JavaScript 在提交按钮的验证方法之前进行表单验证的详细攻略: 步骤1:在视图中创建表单 首先,我们需要在 Yii 的视图中创…

    JavaScript 2023年6月10日
    00
  • js去除重复字符串两种实现方法

    当需要去除重复的字符串时,在JavaScript中可以采用两种不同的实现方式:使用Set数据结构和使用正则表达式。 使用Set数据结构 Set是JavaScript中的一种数据结构,它可以存储不重复的数据,非常适用于去重操作。在使用Set去重时,首先需要将待去重的字符串装入Set中,然后再将Set转成数组即可。 const str = "hello…

    JavaScript 2023年5月28日
    00
  • javascript的BOM汇总

    以下是“Javascript的BOM汇总”的完整攻略。 什么是BOM BOM(Browser Object Model)是指浏览器对象模型,是与浏览器窗口有关的对象的集合,它包括了窗口、地址栏、历史记录、用户代理等对象。 窗口对象 窗口对象是BOM的核心对象之一,它代表了浏览器中的一个窗口或一个标签页。我们可以通过window对象来操作当前窗口或其它窗口的属…

    JavaScript 2023年5月19日
    00
  • js 实现ajax发送步骤过程详解

    关于JS实现AJAX发送步骤过程的详解,可以从以下几个方面来说明: 一、AJAX请求的基本流程 在进行AJAX操作之前,我们需要先创建一个 XMLHttpRequest 对象。该对象主要用于在后台向服务器发出HTTP请求。 然后,设置 XMLHttpRequest 对象的一些属性,如请求类型、请求地址、传递的数据等。在设置完这些属性后,我们需要调用 XMLH…

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