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(面向流的)
NIO:可以把通道理解成铁路,本身不能完成运输,需要借助buffer转载数据。NIO是面向缓冲区的传输,通道只是连接
通道建立的是文件、磁盘、网络和程序的连接。比如磁盘文件的复制,我们需要建立被复制文件和程序的连接,将文件内容装入缓冲区中。然后建立复制文件和程序的通道,将缓冲区的内容写入新文件中。
@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() : 存入数据到缓冲区中
get() : 获取缓冲区中的数据
三、缓冲区中的