Java NIO+示例代码

简介: Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。Java NIO 的主要组成部分包括: 1. Channel:通道是一个在应用程序和文件、网络套接字之间的连接。可以通过通道来进行数据的读取和写入。2. Buffer:缓冲区是一个容器,用于存储数据。在 NIO 中,所有的数据读取和写入都是通过缓冲区进行的。3. Selector:选择器用于监听多个 NIO 通道的事件,如读写事件。当某个通道发生事件时,选

Java NIO

一,介绍

Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。

Java NIO 的主要组成部分包括:

    1. Channel:通道是一个在应用程序和文件、网络套接字之间的连接。可以通过通道来进行数据的读取和写入。
    2. Buffer:缓冲区是一个容器,用于存储数据。在 NIO 中,所有的数据读取和写入都是通过缓冲区进行的。
    3. Selector:选择器用于监听多个 NIO 通道的事件,如读写事件。当某个通道发生事件时,选择器会通知该事件并对其进行处理。

    相比传统的 Java IO,Java NIO 的优点包括:

      1. 非阻塞模式:NIO 可以使用非阻塞模式进行网络编程,使程序不必等待网络操作完成才能进行其他操作,提高了程序的响应速度。
      2. 多路复用:一个线程可以同时处理多个 NIO 通道,减少了线程的开销和资源占用。
      3. 缓冲区操作:NIO 使用缓冲区进行数据读取和写入,可以提高数据访问速度。

      下面是 Java NIO 常用类和接口:

        1. Channel:提供了各种类型的通道接口,如 FileChannel、DatagramChannel、SocketChannel 和 ServerSocketChannel 等。
        2. Buffer:提供了各种类型的缓冲区实现,如 ByteBuffer、CharBuffer、ShortBuffer 和 DoubleBuffer 等。
        3. Selector:提供了 Selector 接口,用于监听多个通道的事件,可以使用一个线程处理多个通道。

        总之,Java NIO 提高了网络编程的效率和性能,使得程序可以处理更多并发请求。但同时需要注意 NIO 的复杂性和学习难度,需要仔细理解其原理和使用规范。

        二,区别

        Java IO(传统IO)和 Java NIO(New IO)是两种不同的 I/O API,它们在设计和使用上有一些区别。

          1. 工作方式:
              • Java IO 是基于流(Stream)的模型。它通过字节流和字符流来进行数据读写,每次读写一个或多个字节或字符。
              • Java NIO 是基于缓冲区(Buffer)和通道(Channel)的模型。它将数据读取到缓冲区,然后通过通道进行传输,可以实现非阻塞的 I/O 操作。
                  1. 阻塞与非阻塞:
                      • Java IO 是阻塞式的,读写操作会导致线程阻塞,直到数据可用或操作完成。
                      • Java NIO 支持非阻塞式的 I/O 操作。使用选择器(Selector)可以监听多个通道的事件,只处理已准备好的通道,提高了并发性能。
                          1. 处理方式:
                              • Java IO 使用面向流(Stream-Oriented)的方式,以字节流和字符流为核心,通过流的读写进行数据处理。
                              • Java NIO 使用面向缓冲区(Buffer-Oriented)的方式,先将数据读取到缓冲区,然后再从缓冲区中进行读写操作。
                                  1. API 设计:
                                      • Java IO 提供了较简单易用的 API,但在处理大量并发连接时可能会遇到性能瓶颈。
                                      • Java NIO 提供了更灵活、更底层的 API,允许应用程序更好地控制 I/O 操作,提供了更高的性能和并发处理能力。

                                        总体而言,Java IO 更适合处理简单的 I/O 操作,而 Java NIO 则更适合构建高性能的网络及并发应用程序。但是,Java NIO 的编程模型相对复杂,需要更深入的理解和学习。选择使用哪种 API 取决于具体的需求和应用场景。

                                        三,示例代码

                                        下面是使用Java NIO进行文件读写和网络通信的示例代码:

                                        1. 使用Java NIO进行文件读取和写入:

                                        import java.io.*;
                                        import java.nio.ByteBuffer;
                                        import java.nio.channels.FileChannel;
                                        public class NIOFileExample {
                                            public static void main(String[] args) {
                                                try {
                                                    RandomAccessFile inputFile = new RandomAccessFile("input.txt", "r");
                                                    RandomAccessFile outputFile = new RandomAccessFile("output.txt", "rw");
                                                    FileChannel inputChannel = inputFile.getChannel();
                                                    FileChannel outputChannel = outputFile.getChannel();
                                                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                                                    while (inputChannel.read(buffer) != -1) {
                                                        // Switch buffer from writing to reading mode and vice versa
                                                        buffer.flip();
                                                        outputChannel.write(buffer);
                                                        buffer.clear(); // Clear buffer for next read
                                                    }
                                                    inputChannel.close();
                                                    outputChannel.close();
                                                    inputFile.close();
                                                    outputFile.close();
                                                    System.out.println("File copied successfully.");
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                }
                                            }
                                        }

                                        image.gif

                                         

                                        2. 使用Java NIO进行网络通信:

                                        import java.io.IOException;
                                        import java.net.InetSocketAddress;
                                        import java.nio.ByteBuffer;
                                        import java.nio.channels.SocketChannel;
                                        public class NIONetworkExample {
                                            public static void main(String[] args) {
                                                try {
                                                    SocketChannel socketChannel = SocketChannel.open();
                                                    socketChannel.connect(new InetSocketAddress("example.com", 80));
                                                    String request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
                                                    ByteBuffer buffer = ByteBuffer.wrap(request.getBytes());
                                                    socketChannel.write(buffer);
                                                    ByteBuffer responseBuffer = ByteBuffer.allocate(1024);
                                                    while (socketChannel.read(responseBuffer) != -1) {
                                                        responseBuffer.flip();
                                                        System.out.println(new String(responseBuffer.array()));
                                                        responseBuffer.clear();
                                                    }
                                                    socketChannel.close();
                                                    System.out.println("Request sent and received successfully.");
                                                } catch (IOException e) {
                                                    e.printStackTrace();
                                                }
                                            }
                                        }

                                        image.gif

                                        请注意,在实际应用中,需要正确关闭通道和处理异常。以上代码仅作为示例,实际使用时需要根据实际需求进行适当的优化和异常处理。

                                        目录
                                        相关文章
                                        |
                                        2月前
                                        |
                                        监控 Java API
                                        探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
                                        Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
                                        49 3
                                        |
                                        2月前
                                        |
                                        存储 监控 Java
                                        Java的NIO体系
                                        通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
                                        51 5
                                        |
                                        3月前
                                        |
                                        消息中间件 缓存 Java
                                        java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
                                        零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
                                        java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
                                        |
                                        5月前
                                        |
                                        存储 网络协议 Java
                                        Java NIO 开发
                                        本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
                                        Java NIO 开发
                                        |
                                        4月前
                                        |
                                        Java
                                        让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
                                        这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
                                        57 2
                                        |
                                        6月前
                                        |
                                        Java
                                        "揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
                                        【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
                                        122 2
                                        |
                                        6月前
                                        |
                                        网络协议 C# 开发者
                                        WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
                                        【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
                                        193 0
                                        |
                                        6月前
                                        |
                                        Java Maven C++
                                        【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
                                        【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
                                        107 0
                                        |
                                        6月前
                                        |
                                        存储 网络协议 Java
                                        【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
                                        【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
                                        109 0
                                        |
                                        6月前
                                        |
                                        算法 Java
                                        HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
                                        HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
                                        68 0