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日

相关文章

  • js多线程解决方案Web Worker简单说明与实例演示

    Web Worker是一个可以让JavaScript在浏览器上跑多个进程的方案,它可以让JavaScript不阻塞UI线程,大大提高网页的性能和用户体验。Web Worker是HTML5标准里的一部分,目前主流的现代浏览器都支持Web Worker。 Web Worker的基础知识 什么是Web Worker? Web Worker是一种JavaScript…

    JavaScript 2023年5月28日
    00
  • javascript中的Base64、UTF8编码与解码详解

    JavaScript中的Base64和UTF-8编码与解码详解 简介 Base64编码和UTF-8编码是在JavaScript中经常用到的两种编码方式。本文将全面介绍这两种编码方式的概念、原理、应用以及在JavaScript中的使用。 Base64编码和解码 概念 Base64编码是一种对8位字符或字节流进行编码的方式,使得它们只包含ASCII可打印字符,用…

    JavaScript 2023年5月20日
    00
  • JavaScript面向对象编写购物车功能

    当我们在构建一个购物车功能时,可以采用JavaScript面向对象编程的方式来实现。下面是一个完整的攻略: 1. 设计购物车功能 首先要明确购物车的功能和特点,确定购物车所需要存储的数据。 在购物车中,我们需要存储商品的信息,如名称、价格、数量等,同时还需要实现添加、删除、修改商品以及计算购物车总价等功能。 我们可以创建一个Car对象来代表购物车,同时定义一…

    JavaScript 2023年6月11日
    00
  • javascript中的有名函数和无名函数

    JavaScript中的函数可以分为有名函数和无名函数两种类型。有名函数为函数定义指定了一个名称,而无名函数则没有。 有名函数 函数定义 有名函数最基本的定义方式就是定义一个函数名,并编写函数体: function add(a, b) { return a + b; } 这是定义一个相加函数的示例,函数名为add,接受两个参数a和b,并返回a和b的和。 函数…

    JavaScript 2023年5月27日
    00
  • wasm+js实现文件获取md5示例详解

    “wasm+js实现文件获取md5示例详解”是一个比较复杂的项目,需要包括对wasm和js的理解,以及对md5算法的运用。下面是一个完整的攻略: 1. 项目背景 本项目是一个文件获取md5的示例,在web前端常见的场景中,为了保证文件的完整性或安全性,需要对文件进行md5加密,以此保护文件不被篡改或窃取。而在web前端实现md5加密,需要借助wasm和js的…

    JavaScript 2023年5月27日
    00
  • js将字符串转成正则表达式的实现方法

    让我来详细讲解一下“JS将字符串转成正则表达式的实现方法”的攻略。 使用RegExp构造函数 我们可以使用JavaScript中的RegExp构造函数将字符串转成正则表达式。RegExp对象是一个具有预定义属性和方法的内置JavaScript对象,它可以用来创建正则表达式对象。下面是一个例子: const patternString = ‘test’; //…

    JavaScript 2023年5月28日
    00
  • 深入理解JS中的Function.prototype.bind()方法

    关于深入理解JS中的Function.prototype.bind()方法,本文将分为以下几个部分进行详细讲解: Function.prototype.bind()介绍 Function.prototype.bind()的参数和返回值 Function.prototype.bind()与this的绑定 Function.prototype.bind()的实现…

    JavaScript 2023年5月27日
    00
  • JavaScript数组方法-系统性总结详解

    JavaScript数组方法-系统性总结详解 概述 数组(Array)是JavaScript中最常用、最重要的一种数据类型,而且在实际开发中,我们也经常需要对数组进行各种操作,比如查询、增加、删除、排序等等。JavaScript提供了很多数组方法,让我们能够方便快捷的对数组进行各种操作,使得开发变得更加高效。本篇文章旨在对JavaScript数组方法进行系统…

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