-
Java NIO.2
收藏详细介绍 JSR203(More New I/O APIs for the Java Platform)规范。 从 Java 7 开始,可以使用 NIO.2 部分替换旧的 I/O 操作。
最近更新文章
[NIO.2] 第四十一篇 随机访问文件概述
我们已经看过很多顺序读取文件的例子,文件除了可以被顺序读取,还可以被随机读取(random access files 简称 RAF)。通常来说,因为编码简单顺序读取文件更常用。随机读取文件更加灵活,并且读取数据更快。
使用 RAF 可以打开文件,跳转到文件中的某个位置,并在这个位置上进行读写操作。在打开 RAF 后,可以使用记录号来自由地读写文件,如果你知道文件的总记录号,你还可以在文件末尾添加内 ...
[NIO.2] 第四十篇 监控目录树
现在,我们编写一个应用来监控 C:\rafaelnadal 目录。此外,如果在这个目录中发生了 CREATE 事件创建了一个新目录,那么这个目录将会被立即注册,和 C:\rafaelnadal 中一开始就存在的目录一样。
首先,创建监控服务:
private WatchService watchService = FileSystems.getDefault().newWatchService( ...
[NIO.2] 第三十九篇 实现文件监控服务
要实现监控服务需要有几个步骤。在本文中,你将会看到实现监控服务的主要步骤,并且开发监控目录创建、删除和修改的应用。每个步骤都会有代码和实例进行讲解,文章的最后将会把所有步骤合在一起,编写一个完整的应用。
创建 WatchService
最开始,需要创建 WatchService 用于监控文件系统。可以调用 FileSystem.newWatchService() 方法来创建这个对象:
Watc ...
[NIO.2] 第三十八篇 监控服务 API
Java 7 NIO.2 引入了线程安全的监控服务,用于监控对象的改变和事件。大多数时候,用于监控目录和文件内容的改变,例如对目录中的文件进行增删改的操作。你可能已经见过这样的情况。当你在使用文本编辑器编辑文件的时候,如果你在文本编辑器的外部改变了文件的内容,那么文本编辑器会察觉到这个改变,并及时通知你。这就是系统的文件改变通知机制。NIO.2 开始提供了监控服务 API 来支持这个功能。
监控服 ...
[NIO.2] 第三十七篇 编写一个文件移动应用
移动文件分为两个步骤,先拷贝文件,再删除源文件。
下面的代码将会把 C:\rafaelnadal 目录中的内容移动到 C:\ATP\players\rafaelnafal 目录中。在移动前,要确保 C:\ATP\players\rafaelnafal 目录已经存在。在这个例子中,目录的移动使用了 Files.copy() 和 Files.delete() 方法,文件的移动使用了 Files.mo ...
[NIO.2] 第三十六篇 编写一个文件拷贝应用
拷贝目录树的时候,需要为文件和目录递归调用 Files.copy() 方法。在开始编写代码之前,要注意以下几点:
在拷贝目录中的文件之前,必须先拷贝目录本身。不管目录中是否有文件,拷贝目录后的结果都将是空目录。这个任务必须在 preVisitDirectory() 中完成。
拷贝文件最好在 visitFile() 方法中进行。
在拷贝文件或目录的过程中,你要考虑是否需要使用 REPLACE_EX ...
[NIO.2] 第三十五篇 编写一个文件删除应用
如果要删除单个文件,可以直接调用 delete() 或 deleteIfExists() 方法,它们会将文件从文件系统中删除。如果要删除目录树,则是通过 FileVisitor 的具体实现来递归调用 delete() 或 deleteIfExists() 方法。在开始之前,要注意以下原则:
在删除目录之前,要确保目录是空的。
删除文件最好在 visitFile() 方法中。
...
[NIO.2] 第三十四篇 编写一个文件搜索应用
大多数操作系统都提供了独立的工具用于文件搜索(例如,Linux 上的 find 命令,Windows 上的文件搜索工具)。从简单到高级,这些工具提供的搜索模式都大同小异:用户提供搜索条件,等待搜索工具返回搜索结果。如果你想自己编写搜索程序,那么可以利用 FileVisitor 接口。你可以编写按文件名、按文件扩展名、按区域匹配、按文件内容来搜索文件的功能。
利用 FileVisitor 来编写搜索 ...
[NIO.2] 第三十三篇 遍历目录树
一旦你创建了遍历机制(实现 FileVisitor 接口或继承 SimpleFileVisitor 类),那么就可以调用 Files.walkFileTree() 方法遍历目录树。首先我们定义遍历机制:
class ListTree extends SimpleFileVisitor<Path> {
@Override
public FileVisitResul ...
[NIO.2] 第三十二篇 SimpleFileVisitor 类
要实现 FileVisitor 接口就要实现接口上的所有方法,但是你有可能只需要实现其中的一两个方法,因此这对于你来说会显得很麻烦。在这种情况下,你可以继承 SimpleFileVisitor 类,它是 FileVisitor 接口的一个实现。这样,你就仅仅只需要覆盖你需要的方法即可。
例如,你可能需要遍历目录树并打印所有目录的名字。要实现这个目标,只需要覆盖 postVisitDirector ...
[NIO.2] 第三十一篇 FileVisitor 接口
FileVisitor 接口提供了递归遍历文件树的支持。这个接口上的方法表示了遍历过程中的关键过程,允许你在文件被访问、目录将被访问、目录已被访问、发生错误等等过程上进行控制;换句话说,这个接口在文件被访问前、访问中和访问后,以及产生错误的时候都有相应的钩子程序进行处理。
调用 FileVisitor 中的方法,会返回访问结果 FileVisitResult 对象值,用于决定当前操作完成后接下来该 ...
[NIO.2] 第三十篇 递归操作简述
你可能知道,在编程中使用递归技术一直有争议,但是它的确简化了一些编程任务。简单来说,递归就是应用程序调用自身的过程。比如计算阶乘,计算费氏数列等都是非常著名的可用递归方式来完成的任务。下面看看一个计算阶乘(n!=1*2*3*4...*n)的例子,注意看程序如何调用自身:
/**
* Calculate the factorial of n (n! = 1 * 2 * 3 * … * n). ...
[NIO.2] 第二十九篇 删除、复制、移动目录和文件
删除、拷贝和移动操作是最常见的文件操作。NIO.2 提供了独立的方法来支持这些操作。它们中的大部分都来自 Files 类。
删除文件和目录
NIO.2 提供了两个方法来删除文件和目录,分别是 Files.delete() 和 Files.deleteIfExits()。这两个方法都接受一个 Path 类型的参数用于指定删除对象。不同的是,Files.delete() 的返回值是 void,而 ...
[NIO.2] 第二十八篇 创建临时目录和文件
临时目录是用于存储临时文件的目录。临时目录的位置依赖操作系统。在 Windows 中,临时目录通过 TEMP 环境变量定义,通常位置是 C:\Temp、%Windows%\Temp,或者根据每个用户放到 Local Settings\Temp。在 Linux/Unix 中,全局临时目录在 /tmp 和 /var/tmp。
创建临时目录
NIO.2 提供了 createTempDirecto ...
[NIO.2] 第二十七篇 新建、读取和写出文件
对文件来说,可能最常用的操作就是创建、读取和写出。NIO.2 提供了丰富的方法来完成这些任务。本文从简单的小文件操作开始,最后以缓冲和非缓冲流的操作结束。
流分为输入流和输出流(可以输出到任何地方,比如硬盘或内存)。流支持不同类型的数据,比如字符串、字节、原始数据类型、本地化字符、对象等。使用非缓冲流,读和写的操作直接依赖底层文件系统,使用缓冲流,数据从内存的缓冲区读取,只有缓冲区空了之后才会调用 ...
[NIO.2] 第二十六篇 创建目录以及列出目录内容
列出文件系统根目录
在 Java 6 中,获取根目录是通过 File 对象的数组。在 Java 7 中,NIO.2 提供了方法可以通过存放了 Path 对象的迭代器来获取。这个可迭代的对象通过下面的方式由 getRootDirectories() 方法获得:
Iterable<Path> dirs = FileSystems.getDefault().getRootDirector ...
[NIO.2] 第二十五篇 文件及目录的校验
在对文件或目录进行操作之前,可以先调用 Files 类上的一系列 isXXX 方法来对文件或目录进行校验。对文件先进行校验再操作可以避免产生一些不必要的 ...
[NIO.2] 第二十四篇 定位链接所指向的目标文件位置
调用 Files.readSymbolicLink() 方法可以返回链接所指向的目标文件的 Path 对象。这个方法接受一个 Path 类型的参数,这个参数必须是一个链接,否则会抛出 NotLinkException 异常。
调用 Files.isSameFile() 方法可以判断链接和文件是否指向同一文件。
下面的例子中,链接为 rafael.nadal.6,目标文件是 C:\rafaelna ...
[NIO.2] 第二十三篇 检验软链接
Path 对象可能表示文件或链接。如果 Path 对象指向软链接,可以调用 Files.isSymbolicLink() 方法来进行判断,这个方法接收一个 Path 类型的参数,并返回 boolean 值。下面的代码创建了一个名为 rafael.nadal.5 的软链接,并指向 C:\rafaelnadal\photos\rafa_winner.jpg 文件,随后校验了 Path 对象。
…
...
[NIO.2] 第二十二篇 创建硬链接
可以调用 createLink() 方法创建硬链接,它将会创建已存在文件的硬链接。这个方法返回新链接的 Path 对象,你可以使用这个 Path 对象来访问文件。
如果你的文件系统不支持硬链接,那么将会抛出 UnsupportedOperationException 异常。另外,要记住,硬链接只能为已存在的文件创建。
下面的代码演示了如何创建一个硬链接,名为 rafael.nadal.4 目标文 ...