java NIO 详解

yizhihongxing

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判断H5上下滑动方向及滑动到顶部和底部判断的示例代码

    下面是关于Js判断H5上下滑动方向及滑动到顶部和底部判断的完整攻略: 一、背景 在H5页面中,经常需要判断用户向上滑动或向下滑动,并且需要知道用户是否已经滑动到了页面的顶部或底部。为了实现这个功能,需要借助Js的一些特性和事件,下面将会详细介绍。 二、滑动事件 当页面出现滚动条时,可以侦测滚动条的滑动事件,常用的有scroll、touchmove等事件。其中…

    JavaScript 2023年6月11日
    00
  • JavaScript 详解缓动动画的封装与使用

    JavaScript 详解缓动动画的封装与使用 概述 缓动动画是一种常见的动画效果,它在动画运行初期速度较快,在结束时速度逐渐减慢,运动距离也逐渐减小,这种动画效果更符合人眼的视觉特性,所以受到广泛的应用。 在 JavaScript 中,我们可以通过封装函数来实现缓动动画,下面我们就来详细讲解一下。 实现思路 首先,我们需要知道缓动动画的原理,即在动画过程中…

    JavaScript 2023年6月10日
    00
  • JavaScript实现网站访问次数统计代码

    下面我会详细讲解“JavaScript实现网站访问次数统计代码”的完整攻略。 1. 为什么需要统计网站访问次数? 网站的访问次数统计可以帮助站长了解网站的流量并进行网站流量分析,进而针对性的优化网站,提高网站的访问量和用户满意度。 2. 实现网站访问次数的方法 实现网站访问次数的方法有很多种,其中比较常见的方法有两种:一种是使用服务器日志统计网站访问次数,另…

    JavaScript 2023年6月11日
    00
  • C#监测IPv4v6网速及流量的实例代码

    先给出完整的攻略目录,方便理清思路: 前置知识:C#网络库的使用 监测IPv4v6网速及流量的实现方法 示例1:监测本机流量并将数据保存至文件 示例2:通过Ping测试监测网络延迟 下面我就从这个目录入手,逐一给出详细的说明: 前置知识:C#网络库的使用 在监测网速和流量时,我们需要使用C#的网络库来进行网络通信相关操作。C#网络库主要包括Socket、We…

    JavaScript 2023年5月28日
    00
  • Javascrip基础之for循环和数组

    Javascript基础之for循环和数组 在Javascript中,for循环和数组是非常重要的基础知识点,它们可以帮助我们完成很多重要的任务,如循环迭代,数据处理等。本文将详细讲解Javascript中的for循环和数组的用法,帮助大家掌握这些重要的知识点。 for循环 for循环是一种常见的循环方式,可以重复执行指定的代码块。它的基本语法如下: for…

    JavaScript 2023年5月27日
    00
  • 解决前端跨域问题方案汇总

    让我来为您详细讲解解决前端跨域问题方案汇总的完整攻略。 一、跨域问题简介 跨域(Cross-Origin)是指在浏览器的同源策略下,不同源的服务器无法通信的一种安全机制。同源是指协议、域名和端口号完全相同。 例如: http://www.example.com 与 http://www.example.com/path1 为同源; http://www.ex…

    JavaScript 2023年6月11日
    00
  • vue3项目中使用tinymce的方法

    下面是vue3项目中使用tinymce编辑器的完整攻略: 安装tinymce 首先,在终端中通过npm包管理器安装tinymce: npm install tinymce –save 引入tinymce 在需要使用的组件中引入tinymce的js文件: <template> <div> <textarea id="e…

    JavaScript 2023年6月11日
    00
  • DOM节点删除函数removeChild()用法实例

    当你需要从HTML中删除一个或多个节点时,可以使用JavaScript中的removeChild()函数。下面是使用removeChild()函数的详细攻略。 什么是removeChild()函数? removeChild()函数是访问HTML DOM节点的JavaScript方法之一。它可用于删除HTML节点和其子节点,从而实现从HTML文档中删除DOM元…

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