18_NIO

Java NIO(New IO)从Java 1.4开始引入,提供了一种更高效的数据读写方式。NIO的核心是通道(Channel)和缓冲区(Buffer)。通道负责数据传输,缓冲区负责数据存储。NIO支持非阻塞式网络通信,通过选择器(Selector)可以管理多个通道,减少线程资源消耗。直接缓冲区和非直接缓冲区是两种不同类型的缓冲区,直接缓冲区性能更优但分配成本高。文件通道(FileChannel)、SocketChannel、ServerSocketChannel和DatagramChannel是常见的NIO通道类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java NIO简介

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。 NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文 件的读写操作。

Java NIO 与IO的主要区别

IO NIO
面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO)
(无) 选择器(Selectors)

流,建立通道,直接面对数据的流动,输入输出都需要分别建立连接。(单向的)

管道:建立一个通道即可,通过buffer转载数据,buffer可读可写

传统的IO(面向流的)

image-20200916085552924

NIO:可以把通道理解成铁路,本身不能完成运输,需要借助buffer转载数据。NIO是面向缓冲区的传输,通道只是连接

image-20200916090025888

通道建立的是文件、磁盘、网络和程序的连接。比如磁盘文件的复制,我们需要建立被复制文件和程序的连接,将文件内容装入缓冲区中。然后建立复制文件和程序的通道,将缓冲区的内容写入新文件中。

@Test
public void testNIO() throws Exception {
   
  FileChannel fileChannel = FileChannel.open(Paths.get("1.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);
  ByteBuffer buffer = ByteBuffer.allocate(1024);
  System.out.println("读文件的内容....");
  fileChannel.read(buffer);
  buffer.flip();
  System.out.println(new String(buffer.array(), 0, buffer.limit()));
  buffer.clear();
  System.out.println("写入内容到文件中文件... ");
  buffer.put("文件的新内容".getBytes());
  buffer.flip();
  fileChannel.write(buffer);
  buffer.clear();


  fileChannel.close();
}

@Test
public void testIO() throws Exception {
   
  FileInputStream fis = new FileInputStream("1.txt");
  FileOutputStream fos = new FileOutputStream("1.txt");

  System.out.println("源文件内容:" + fis.read());
  fos.write("新的内容".getBytes());
  fos.close();
  fis.close();
}

缓冲区(Buffer)和通道(Channel)

通道和缓冲区

Java NIO系统的核心在于:通道(Channel)和缓冲区 (Buffer)。通道表示打开到 IO 设备(例如:文件、 套接字)的连接。若需要使用 NIO 系统,需要获取 用于连接 IO 设备的通道以及用于容纳数据的缓冲 区。然后操作缓冲区,对数据进行处理。

简而言之,Channel 负责传输, Buffer 负责存储

缓冲区(Buffer)

  • 缓冲区(Buffer):一个用于特定基本数据类 型的容器。由 java.nio 包定义的,所有缓冲区 都是 Buffer 抽象类的子类。

  • Java NIO 中的 Buffer 主要用于与 NIO 通道进行 交互,数据是从通道读入缓冲区,从缓冲区写 入通道中的。

一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据
根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区
  
二、缓冲区存取数据的两个核心方法:
put() : 存入数据到缓冲区中
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值