拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 NIO 和 NIO.2 有什么区别?

NIO 和 NIO.2 有什么区别?

白鹭 - 2022-03-07 2294 0 2

一、简介

在本教程中将介绍 Java IO 功能以及在不同的 Java 版本中的变化。我们首先,我们将它们最终中引入 Java 版本,中最终版本java.io,将java.nioJava 1.4 中引入的 java.nio 介绍。java.nio.file包,通常称为 NIO.2 包。

2.Java NIO包

第一个 Java 版本与java.io包一起发布,引入a File类来访问文件系统。File类和目录,并提供对文件系统的有限操作。表示文件可以创建和删除,检查它们是否存在,检查读/写访问等。

它也有一些缺点:

  • 未经复制的方法——要复制一个实例并使用,我们需要File来查看并编写另一个File实例。

  • 处理错误——一些方法boolean作为操作成功与否的指示返回。

  • 一组的有限文件属性——名称、路径、读/写权限、可用内存大小等。

  • 拒绝API——我们的请求被拒绝,直到IO操作完成。

要读取文件,我们需要一个FileInputStream实例来从文件中读取字节:

@Test
 public void readFromFileUsingFileIO() throws Exception {
 File file = new File("src/test/resources/nio-vs-nio2.txt");
 FileInputStream in = new FileInputStream(file);
 StringBuilder content = new StringBuilder();
 int data = in.read();
 while (data != -1) {
 content.append((char) data);
 data = in.read();
 }
 in.close();
 assertThat(content.toString()).isEqualTo("Hello from file!");
 }

Java 1.4 引入了捆绑java.nio包中的非 IO API(nio 代表阻尼新 IO)。引入 NIO 是为了实现java.io包的限制。这个包引入了三个核心类:ChannelBufferSelector

2.1Channel

Java 读取和通常是 NIOChannel的一类,我们的类。类似(这里说是 IO ,而不是ChannelJava.8 ),但允许我们向一些不同的朋友。 ,它们可以随意读写。StreamsStreamsStreamsChannelStreams

Channel类有几个,包括FileChannel用于文件系统读/写,用于在实现DatagramChannel网络上读/写时使用UDP,以及SocketChannel用于在网络上读/写TCP。

2.2Buffer

细节是内存,主要工作对象可以Buffer提供或写入数据:容量、位置和限制。BufferBufferBuffer

  • 定义内存的大小。当我们将数据写入授权时,我们的长度有限。当我们已尽职时,我们需要清除写入或清除数据。

  • 位置是写入的起始位置。一个我们空时从数据到的capacity – 1。另外,当我们读取数据时,我们从位置开始。

  • 限制我们如何从看似写和读取。

Buffer每个原始 Java 有一个,不包括Boolean类型和类型MappedByteBuffer

重要的重要,方法我们需要知道一些:

  • allocate(int value) –我们使用这个方法来创建一个特定类型的风格。

  • flip()- 此方法从用于写入模式切换到读取模式

  • clear() –清除内容的方法

  • compact() –只清除我们已经阅读的内容的方法

  • rewind() –位置重置为原创,0以便我们描绘中的数据

使用前面描述的概念,让我们使用ChannelBuffer类从文件中读取内容:

@Test
 public void readFromFileUsingFileChannel() throws Exception {
 RandomAccessFile file = new RandomAccessFile("src/test/resources/nio-vs-nio2.txt", "r");
 FileChannel channel = file.getChannel();
 StringBuilder content = new StringBuilder();
 ByteBuffer buffer = ByteBuffer.allocate(256);
 int bytesRead = channel.read(buffer);
 while (bytesRead != -1) {
 buffer.flip();
 while (buffer.hasRemaining()) {
 content.append((char) buffer.get());
 }
 buffer.clear();
 bytesRead = channel.read(buffer);
 }
 file.close();
 assertThat(content.toString()).isEqualTo("Hello from file!");
 }

在初始化所有的对像之后,我们从通道中flip()获得了杰出的作品。我们的结果中。最后,我们清除数据并读取另一批。

2.3.Selector

Java NIO Selector允许我们用我们一个通道管理多个通道,必须选择使用对象监控器,必须使用多个通道的实例监控,并且必须使用非通道模式表示,并且它是通道注册后我们得到一个SelectionKey多个对象,必须通道。和通道之间的连接。当我们有多个使用通道的连接select()方法时,我们可以来检查有通道选择select()使用selectedKeys()方法的时候。

2.4. NIO 封装的缺点

java.nio尽管他们允许 API 相关的变化与动态包的更多变化有关,但其他方面仍然存在:

  • 对符号链接的有限支持

  • 对文件属性访问的有限支持

  • 你的文件更好的系统管理工具

3.Java NIO.2包

Java 1.7 引入了的新包,也java.nio.fileNIO.2java.nio中不支持的高级包。 IO 的异步与方法最重要的变化文件一起。是添加了Files, Path,PathsAsynchroniousFileChannelAsyncroniousSocketChannel

Path由方法在不同的分隔符最分隔的目录和文件名的其他对象和序列。根组件在离开,而提供文件在右边。诸如此类的实用方法,、、getFileName()文件之间提供的文件。 Paths 类是一个实用的实用程序方法,它们接收以创建实例。getParent()PathresolverelativizeStringURIPath

Files提供了使用前面描述的Path类文件、还目录和符号链接的实用方法readAttributes()

最后,让我们看看 NIO.2 在读取我们文件时与之前的 IO 版本对比如何:

@Test
 public void readFromFileUsingNIO2() throws Exception {
 List<String> strings = Files.readAllLines(Paths.get("src/test/resources/nio-vs-nio2.txt"));
 assertThat(strings.get(0)).isEqualTo("Hello from file!");
 }

4. 结论

在中,我们和包的基础知识可以看到,NIO.2 引入了 NIO 包的新版本。NIO API 非抑制了本文 IO 的介绍级,而 NIO.2 用于引入了java.nio更好java.nio.file这两个包不是同义词,相互补充。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *