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日

相关文章

  • JavaScript代码优化技巧示例详解

    JavaScript代码优化技巧示例详解 作为一个合格的JavaScript开发者,不仅要求编写出正确的代码,还要考虑代码的性能和可维护性。下面是一些JavaScript代码优化技巧: 1. 避免使用全局变量 在JavaScript中,全局变量会存在全局作用域中,可以被任何函数访问,这样会造成变量污染和内存泄漏问题。因此,我们应该尽量避免使用全局变量,可以将…

    JavaScript 2023年5月28日
    00
  • 用Axios Element实现全局的请求loading的方法

    下面是使用Axios Element实现全局请求loading的方法的攻略。 什么是Axios Element Axios Element是基于Axios封装的一个插件,使得我们可以很方便地对Axios进行增强和自定义操作。 实现全局请求loading的方法 我们可以将全局请求loading的实现分为以下几个步骤: 1. 安装Axios Element 我们…

    JavaScript 2023年6月11日
    00
  • ajax jquery 异步表单验证示例代码

    当用户在网站上提交表单时,通常不希望页面重新加载或刷新。通过使用AJAX和jQuery,可以实现异步表单验证。具体攻略如下: 第一步:添加jQuery库 在页面中先添加jQuery库,确保其正常工作。可以从以下链接下载并将其添加到页面中。 <script src="https://code.jquery.com/jquery-3.5.1.mi…

    JavaScript 2023年6月10日
    00
  • JavaScript中也使用$美元符号来代替document.getElementById

    在JavaScript中,我们常常会使用到document对象来访问HTML元素。比如,要获取id为”myElement”的元素,可以使用document对象中的getElementById方法来获取该元素: var myElement = document.getElementById("myElement"); 这种方式非常的常见,但…

    JavaScript 2023年6月10日
    00
  • 全面了解JavaScript的作用域链

    下面我会详细讲解全面了解 JavaScript 的作用域链的攻略。 什么是 JavaScript 的作用域链? JavaScript 的作用域链是由当前执行环境的变量对象和它的父级环境的变量对象构成的一条链。当执行环境需要访问一个变量时,它会首先在当前的变量对象中查找,如果没有找到,它会从父级环境的变量对象中查找,直到找到该变量的值或者查找到全局作用域,如果…

    JavaScript 2023年5月28日
    00
  • 开发轻量级REST API样板 基于Node.js、MongoDB 通过Mongoose驱动

    ZY.Node.Mongodb https://gitee.com/Z568_568/node.mongodb.git https://github.com/ZHYI-source/ZY.Node.Mongodb.git 项目介绍 基于 Node.js、Express.js 和 MongoDB 通过Mongoose驱动进行 REST API 开发的轻量级样板…

    JavaScript 2023年4月18日
    00
  • Javascript Date setMilliseconds() 方法

    JavaScript 中的 setMilliseconds() 方法用于设置日期对象的毫秒部分。在本教程中,我们将详细介绍 setMilliseconds() 方法的使用方法。 setMilliseconds() 方法基本语法如下: date.setMilliseconds(msValue) 其中,msValue 是设置的毫秒值,必须是一个介于 0 到 99…

    JavaScript 2023年5月11日
    00
  • vs2008 JavaScript 语法提示(Intellisense)功能

    下面是关于“vs2008 JavaScript 语法提示(Intellisense)功能”的完整攻略: 什么是Intellisense功能 Intellisense是Visual Studio编写代码时常用到的一个功能,它可以给开发人员提供实时的帮助和提示。Intellisense可以通过分析代码上下文以及被调用对象的成员和方法,来提供方法、属性和类型的完整…

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