Java NIO(Non-blocking I/O)简单理解

Java NIO是Java平台中用于高效输入/输出(I/O)操作的一套新的API,与标准的Java I/O(基于流的阻塞I/O)不同,Java NIO提供了非阻塞式的I/O操作。

Java NIO 的核心组件

Java NIO主要由以下几个核心部分组成:

  1. Channels(通道)
  • Channels是对原生的I/O对象(如文件、套接字等)的抽象表示。
  • 数据可以通过Channel从一个源读取到多个缓冲区中,也可以从多个缓冲区写入到目的地。
  • Channel是双向的,但是具体的Channel实现可能是单向的,例如,你只能从FileChannel中读取数据,而不能向其写入数据(除非文件是以写模式打开的)。
  1. Buffers(缓冲区)
  • Buffer是一个对象,它包含了一个固定大小的数据数组。
  • Buffer类提供了一组方法,用于操作缓冲区内的数据,如读取、写入、清空等。
  • Buffer类不是线程安全的,因此,在多线程环境下使用Buffer时,需要采取适当的同步措施。
  1. Selectors(选择器)
  • Selector允许单个线程监视多个Channel上的I/O事件。
  • 你可以注册多个Channel到一个Selector上,然后调用一个阻塞方法(如select()),该方法会返回已经就绪(即可以进行I/O操作)的Channel的数量。
  • Selector的引入极大地提高了非阻塞模式下处理多个Channel的能力。

在这里插入图片描述

示例代码

下面是一个简单的Java NIO示例,展示了如何使用FileChannel来读取文件内容:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class NIOExample {
    public static void main(String[] args) {
        // 创建一个文件输入流
        FileInputStream fis = null;
        FileChannel fileChannel = null;

        try {
            fis = new FileInputStream("example.txt");
            fileChannel = fis.getChannel();

            // 分配一个Buffer
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            // 读取数据到Buffer中
            int bytesRead;
            while ((bytesRead = fileChannel.read(buffer)) != -1) {
                // 切换为读模式
                buffer.flip();

                // 读取Buffer中的数据
                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                // 切换回写模式
                buffer.clear();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileChannel != null) {
                    fileChannel.close();
                }
                if (fis != null) {
                    fis.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

注意:这个例子仅用于演示如何使用FileChannel和ByteBuffer来读取文件,并未涉及到Selector的使用。Selector通常用于网络编程,特别是处理多个客户端连接时非常有用。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值