# NIO 教程

> 原文： [https://howtodoinjava.com/java-nio-tutorials/](https://howtodoinjava.com/java-nio-tutorials/)

Java NIO（新 IO）是 Java 的替代 IO API（来自 Java 1.4），意味着可以替代标准 [Java IO](http://tutorials.jenkov.com/java-io/index.html) API。 与标准 IO API 相比，Java NIO 提供了另一种使用 IO 的方式。 在此页面中，我将列出此博客中与 NIO 相关的所有可用帖子。

![java nio](img/530c6a1ae9a53e40c90c35ccaff0f7ab.png)

## 学习 NIO 的先决条件

#### [Java I/O 在较低级别内部如何工作？](//howtodoinjava.com/java/io/how-java-io-works-internally-at-lower-level/ "How Java I/O Works Internally at Lower Level?")

这篇博客文章主要讨论与 I/O 相关的事物在较低级别的工作方式。 这篇文章供那些想知道如何在机器级别映射 [**Java I/O**](//howtodoinjava.com "java io") 操作的读者使用； 以及您的应用程序在运行时，硬件在所有时间内的所有工作。 我假设您熟悉基本的 IO 操作，例如读取文件，通过 Java I/O API 写入文件； 因为那超出了这篇文章的范围。

#### [标准 IO 和 NIO 之间的差异](//howtodoinjava.com/java/io/difference-between-standard-io-and-nio/ "Difference between standard IO and NIO")

在本教程中，我将专注于确定最明显的区别，在决定在下一个项目中使用哪个区别之前，您必须知道这些区别。

### NIO 基础知识 

#### [**如何在 Java NIO 中定义路径**](//howtodoinjava.com/java-7/nio/how-to-define-path-in-java-nio/ "How to define Path in java NIO")

如果您的应用程序使用 NIO，则应了解有关此类中可用特性的更多信息。 在本教程中，我列出了在 NIO 中创建`Path`的 6 种方法。

#### [NIO 缓冲区](//howtodoinjava.com/java-7/nio/java-nio-2-0-working-with-buffers/ "Java NIO 2.0 : Working With Buffers")

[**缓冲区**](https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html "Buffer")类是构建[**`java.nio`**](//howtodoinjava.com/category/new-jdk-features/java-7-features/nio/ "NIO Tutorials")的基础。 在本教程中，我们将仔细研究缓冲区，发现各种类型，并学习如何使用它们。 然后，我们将了解`java.nio`缓冲区与`java.nio.channels`的通道类之间的关系。

#### [NIO 通道](//howtodoinjava.com/java-7/nio/java-nio-2-0-channels/ "Java NIO 2.0 : Channels")

通道是继[**缓冲区**](//howtodoinjava.com/java-7/nio/java-nio-2-0-working-with-buffers/ "Java NIO 2.0 : Working With Buffers")之后的`java.nio`的第二项重大创新，我们在我之前的教程中已详细了解到。 通道提供与 I/O 服务的直接连接。 **通道是一种在字节缓冲区和通道另一端的实体（通常是文件或套接字）之间有效传输数据的介质。** 通常，通道与操作系统文件描述符具有一对一的关系。 通道类提供了维持平台独立性所需的抽象，但仍可以对现代操作系统的本机 I/O 能力进行建模。 通道是网关，通过它可以以最小的开销访问操作系统的本机 I/O 服务，而缓冲区是通道用来发送和接收数据的内部端点。

### 如何在应用程序中使用 NIO 

#### [使用 NIO 逐行读取文件](//howtodoinjava.com/java8/read-file-line-by-line-in-java-8-streams-of-lines-example/ "Read file line by line in java 8: Streams of Lines Example")

在本文中，我将举例说明一个非常有用的日常编程任务，即**使用 Java IO 逐行读取**文件并执行一些行操作。 在继续之前，请允许我提及本文中所有示例中将要阅读的文件内容。

我将逐行读取文件的内容，并检查是否有任何行包含单词`"password"`，然后进行打印。

#### [**3 种使用 Java NIO 读取文件的方法**](//howtodoinjava.com/java-7/nio/3-ways-to-read-files-using-java-nio/ "3 ways to read files using Java NIO")

在这篇文章中，我展示了几种从文件系统读取文件的方法。

#### [如何在通道之间传输数据？](//howtodoinjava.com/java-7/nio/java-nio-2-0-how-to-transfer-copy-data-between-channels/ "Java NIO : How to transfer data between channels?")

与通常在输入源和输出目标之间发生 IO 的普通 Java 应用程序一样，在 NIO 中，您也可能需要非常频繁地将数据从一个通道传输到另一通道。 文件数据从一个地方到另一个地方的批量传输非常普遍，以至于`FileChannel`类添加了两种优化方法，以使其效率更高。

让我们了解这些方法。

#### [内存映射文件和`MappedByteBuffer`](//howtodoinjava.com/java-7/nio/java-nio-2-0-memory-mapped-files-mappedbytebuffer-tutorial/ "Java NIO 2.0 : Memory-Mapped Files | MappedByteBuffer Tutorial")

内存映射的 I/O 使用文件系统来建立从用户空间直接到适用文件系统页面的虚拟内存映射。 使用内存映射文件，您可以假装整个文件都在内存中，并且可以通过将其视为一个非常大的数组来访问它。 这种方法极大地简化了您为修改文件而编写的代码。

#### [分散/收集或向量 IO](//howtodoinjava.com/2015/01/15/java-nio-2-0-scatter-gather-or-vectored-io/ "Java NIO 2.0 : Scatter/Gather or Vectored IO")

**从通道读取的散射是将数据读取到多个缓冲区中的读取操作**。因此，通道将来自通道的数据**分散**到多个缓冲区中。对通道的聚集写入是一种将来自多个缓冲区的数据写入单个通道的写入操作。因此，通道将来自多个缓冲器的数据**收集**到一个通道中。 在需要分别处理传输数据的各个部分的情况下，分散/收集可能非常有用。

## 参考：

[http://docs.oracle.com/javase/tutorial/essential/io/fileio.html](https://docs.oracle.com/javase/tutorial/essential/io/fileio.html)