Java NIO.2
iteye_3259
这个作者很懒,什么都没留下…
展开
-
[NIO.2] 第四十一篇 随机访问文件概述
我们已经看过很多顺序读取文件的例子,文件除了可以被顺序读取,还可以被随机读取(random access files 简称 RAF)。通常来说,因为编码简单顺序读取文件更常用。随机读取文件更加灵活,并且读取数据更快。使用 RAF 可以打开文件,跳转到文件中的某个位置,并在这个位置上进行读写操作。在打开 RAF 后,可以使用记录号来自由地读写文件,如果你知道文件的总记录号,你还可以在文件末尾...2014-04-29 14:51:25 · 221 阅读 · 0 评论 -
[NIO.2] 第三十篇 递归操作简述
你可能知道,在编程中使用递归技术一直有争议,但是它的确简化了一些编程任务。简单来说,递归就是应用程序调用自身的过程。比如计算阶乘,计算费氏数列等都是非常著名的可用递归方式来完成的任务。下面看看一个计算阶乘(n!=1*2*3*4...*n)的例子,注意看程序如何调用自身:[code="java"]/** * Calculate the factorial of n (n! = 1 *...2014-04-12 15:46:27 · 96 阅读 · 0 评论 -
[NIO.2] 第二十九篇 删除、复制、移动目录和文件
删除、拷贝和移动操作是最常见的文件操作。NIO.2 提供了独立的方法来支持这些操作。它们中的大部分都来自 Files 类。[b][size=x-large]删除文件和目录[/size][/b]NIO.2 提供了两个方法来删除文件和目录,分别是 Files.delete() 和 Files.deleteIfExits()。这两个方法都接受一个 Path 类型的参数用于指定删除对象。...2014-04-10 16:28:18 · 156 阅读 · 0 评论 -
[NIO.2] 第二十八篇 创建临时目录和文件
临时目录是用于存储临时文件的目录。临时目录的位置依赖操作系统。在 Windows 中,临时目录通过 TEMP 环境变量定义,通常位置是 C:\Temp、%Windows%\Temp,或者根据每个用户放到 Local Settings\Temp。在 Linux/Unix 中,全局临时目录在 /tmp 和 /var/tmp。[b][size=x-large]创建临时目录[/size][/b...2014-04-09 13:59:37 · 411 阅读 · 0 评论 -
[NIO.2] 第二十七篇 新建、读取和写出文件
对文件来说,可能最常用的操作就是创建、读取和写出。NIO.2 提供了丰富的方法来完成这些任务。本文从简单的小文件操作开始,最后以缓冲和非缓冲流的操作结束。流分为输入流和输出流(可以输出到任何地方,比如硬盘或内存)。流支持不同类型的数据,比如字符串、字节、原始数据类型、本地化字符、对象等。使用非缓冲流,读和写的操作直接依赖底层文件系统,使用缓冲流,数据从内存的缓冲区读取,只有缓冲区空了之后才...2014-04-07 20:09:30 · 155 阅读 · 0 评论 -
[NIO.2] 第二十六篇 创建目录以及列出目录内容
[b][size=x-large]列出文件系统根目录[/size][/b]在 Java 6 中,获取根目录是通过 File 对象的数组。在 Java 7 中,NIO.2 提供了方法可以通过存放了 Path 对象的迭代器来获取。这个可迭代的对象通过下面的方式由 getRootDirectories() 方法获得:[code="java"]Iterable dirs = FileSys...2014-04-07 12:14:17 · 125 阅读 · 0 评论 -
[NIO.2] 第二十五篇 文件及目录的校验
在对文件或目录进行操作之前,可以先调用 Files 类上的一系列 isXXX 方法来对文件或目录进行校验。对文件先进行校验再操作可以避免产生一些不必要的异常。例如,可以先校验文件是否存在,再做移动或删除的操作。或者先校验文件是否可读写,再对文件做读写操作。[b][size=x-large]检查文件或目录是否存在[/size][/b]无论真实文件系统中是否真的存在文件或目录,都可以创...2014-04-05 16:26:23 · 443 阅读 · 0 评论 -
[NIO.2] 第二十四篇 定位链接所指向的目标文件位置
调用 Files.readSymbolicLink() 方法可以返回链接所指向的目标文件的 Path 对象。这个方法接受一个 Path 类型的参数,这个参数必须是一个链接,否则会抛出 NotLinkException 异常。调用 Files.isSameFile() 方法可以判断链接和文件是否指向同一文件。下面的例子中,链接为 rafael.nadal.6,目标文件是 C:\raf...2014-04-03 18:30:59 · 133 阅读 · 0 评论 -
[NIO.2] 第二十三篇 检验软链接
Path 对象可能表示文件或链接。如果 Path 对象指向软链接,可以调用 Files.isSymbolicLink() 方法来进行判断,这个方法接收一个 Path 类型的参数,并返回 boolean 值。下面的代码创建了一个名为 rafael.nadal.5 的软链接,并指向 C:\rafaelnadal\photos\rafa_winner.jpg 文件,随后校验了 Path 对象。[...2014-04-03 12:12:51 · 340 阅读 · 0 评论 -
[NIO.2] 第三十一篇 FileVisitor 接口
FileVisitor 接口提供了递归遍历文件树的支持。这个接口上的方法表示了遍历过程中的关键过程,允许你在文件被访问、目录将被访问、目录已被访问、发生错误等等过程上进行控制;换句话说,这个接口在文件被访问前、访问中和访问后,以及产生错误的时候都有相应的钩子程序进行处理。调用 FileVisitor 中的方法,会返回访问结果 FileVisitResult 对象值,用于决定当前操作完成后接...2014-04-12 15:53:54 · 285 阅读 · 0 评论 -
[NIO.2] 第三十二篇 SimpleFileVisitor 类
要实现 FileVisitor 接口就要实现接口上的所有方法,但是你有可能只需要实现其中的一两个方法,因此这对于你来说会显得很麻烦。在这种情况下,你可以继承 SimpleFileVisitor 类,它是 FileVisitor 接口的一个实现。这样,你就仅仅只需要覆盖你需要的方法即可。例如,你可能需要遍历目录树并打印所有目录的名字。要实现这个目标,只需要覆盖 postVisitDirec...2014-04-12 15:57:51 · 702 阅读 · 0 评论 -
[NIO.2] 第四十篇 监控目录树
现在,我们编写一个应用来监控 C:\rafaelnadal 目录。此外,如果在这个目录中发生了 CREATE 事件创建了一个新目录,那么这个目录将会被立即注册,和 C:\rafaelnadal 中一开始就存在的目录一样。首先,创建监控服务:[code="java"]private WatchService watchService = FileSystems.getDefault(...2014-04-29 14:49:40 · 207 阅读 · 0 评论 -
[NIO.2] 第三十九篇 实现文件监控服务
要实现监控服务需要有几个步骤。在本文中,你将会看到实现监控服务的主要步骤,并且开发监控目录创建、删除和修改的应用。每个步骤都会有代码和实例进行讲解,文章的最后将会把所有步骤合在一起,编写一个完整的应用。[b][size=x-large]创建 WatchService[/size][/b]最开始,需要创建 WatchService 用于监控文件系统。可以调用 FileSystem.n...2014-04-26 16:13:20 · 178 阅读 · 0 评论 -
[NIO.2] 第三十八篇 监控服务 API
Java 7 NIO.2 引入了线程安全的监控服务,用于监控对象的改变和事件。大多数时候,用于监控目录和文件内容的改变,例如对目录中的文件进行增删改的操作。你可能已经见过这样的情况。当你在使用文本编辑器编辑文件的时候,如果你在文本编辑器的外部改变了文件的内容,那么文本编辑器会察觉到这个改变,并及时通知你。这就是系统的文件改变通知机制。NIO.2 开始提供了监控服务 API 来支持这个功能。...2014-04-21 14:13:55 · 89 阅读 · 0 评论 -
[NIO.2] 第三十七篇 编写一个文件移动应用
移动文件分为两个步骤,先拷贝文件,再删除源文件。下面的代码将会把 C:\rafaelnadal 目录中的内容移动到 C:\ATP\players\rafaelnafal 目录中。在移动前,要确保 C:\ATP\players\rafaelnafal 目录已经存在。在这个例子中,目录的移动使用了 Files.copy() 和 Files.delete() 方法,文件的移动使用了 Files...2014-04-18 14:20:14 · 113 阅读 · 0 评论 -
[NIO.2] 第三十六篇 编写一个文件拷贝应用
拷贝目录树的时候,需要为文件和目录递归调用 Files.copy() 方法。在开始编写代码之前,要注意以下几点:[list][*]在拷贝目录中的文件之前,必须先拷贝目录本身。不管目录中是否有文件,拷贝目录后的结果都将是空目录。这个任务必须在 preVisitDirectory() 中完成。[*]拷贝文件最好在 visitFile() 方法中进行。[*]在拷贝文件或目录的过程中,...2014-04-18 14:18:16 · 91 阅读 · 0 评论 -
[NIO.2] 第三十五篇 编写一个文件删除应用
如果要删除单个文件,可以直接调用 delete() 或 deleteIfExists() 方法,它们会将文件从文件系统中删除。如果要删除目录树,则是通过 FileVisitor 的具体实现来递归调用 delete() 或 deleteIfExists() 方法。在开始之前,要注意以下原则:[list][*] 在删除目录之前,要确保目录是空的。[*] 删除文件最好在 v...2014-04-17 18:22:20 · 79 阅读 · 0 评论 -
[NIO.2] 第三十四篇 编写一个文件搜索应用
大多数操作系统都提供了独立的工具用于文件搜索(例如,Linux 上的 find 命令,Windows 上的文件搜索工具)。从简单到高级,这些工具提供的搜索模式都大同小异:用户提供搜索条件,等待搜索工具返回搜索结果。如果你想自己编写搜索程序,那么可以利用 FileVisitor 接口。你可以编写按文件名、按文件扩展名、按区域匹配、按文件内容来搜索文件的功能。利用 FileVisitor 来编...2014-04-14 15:39:12 · 115 阅读 · 0 评论 -
[NIO.2] 第三十三篇 遍历目录树
一旦你创建了遍历机制(实现 FileVisitor 接口或继承 SimpleFileVisitor 类),那么就可以调用 Files.walkFileTree() 方法遍历目录树。首先我们定义遍历机制:[code="java"]class ListTree extends SimpleFileVisitor { @Override public FileVisitR...2014-04-14 15:35:02 · 152 阅读 · 0 评论 -
[NIO.2] 第二十二篇 创建硬链接
可以调用 createLink() 方法创建硬链接,它将会创建已存在文件的硬链接。这个方法返回新链接的 Path 对象,你可以使用这个 Path 对象来访问文件。如果你的文件系统不支持硬链接,那么将会抛出 UnsupportedOperationException 异常。另外,要记住,硬链接只能为已存在的文件创建。下面的代码演示了如何创建一个硬链接,名为 rafael.nadal....2014-04-03 00:11:25 · 132 阅读 · 0 评论 -
[NIO.2] 第二十一篇 创建软链接
在 NIO.2 中,创建软链接非常简单,只需要调用 Files.createSymbolicLink() 方法即可。这个方法需要传入软链接和目标文件的 Path 对象,并且可以传入一组文件属性,返回软链接的 Path 对象。如果你的文件系统不支持软链接,那么将会抛出 UnsupportedOperationException 异常。记住,目标文件可以使用绝对路径也可以使用相对路径来定义,并...2014-04-02 18:35:38 · 227 阅读 · 0 评论 -
[NIO.2] 第二十篇 使用命令行创建链接
Windows 用户可以通过命令行的 mklink 命令来创建软链接或硬链接。这个命令有很多选项可用,部分选项列举如下:[list][*] /D 创建目录的软链接,默认创建的是文件软链接。[*] /H 创建硬链接。[*] /J 创建目录节点(Junction)。[*] Link 定义新的符号链接名。[*]...2014-03-31 21:21:33 · 87 阅读 · 0 评论 -
[NIO.2] 第九篇 迭代 Path 对象中的所有元素名称
自从 Path 类实现了 Iterable 接口后,你就可以通过迭代的方法获取 Path 对象上的所有元素。下面是使用for 循环迭代 Path 对象的例子:[code="java"]Path path = Paths.get("C:", "rafaelnadal/tournaments/2009", "BNP.txt"); for (Path name : path) { ...原创 2014-03-25 15:13:39 · 95 阅读 · 0 评论 -
[NIO.2] 第八篇 比较两个 Path 对象
为了不同的目的,你可以使用不同的方式来比较两个 Path 对象是否相等。首先,你可以调用 Path.equals() 方法来进行判断,这个方法遵守 Object.equals() 方法规范。这个方法不会访问实际的文件系统,因此所比较的两个路径可以不用真实存在。这个方法也不会确认两个路径是否指向同一个文件。在一些操作系统中,比较两个路径的时候是大小写忽略的,而在有的系统中,比较两个路径又是大...2014-03-25 15:11:44 · 150 阅读 · 0 评论 -
[NIO.2] 第七篇 通过两个文件之间的关系构建 Path 对象
当你需要通过从一个文件位置到另一个文件位置构建 Path 对象的时候,你可以调用 relativize() 方法,这个方法将通过这两个位置之间的关系来构建 Path 对象。调用这个方法的 Path 对象称为原始路径,传入这个方法的 Path 对象称为传入路径。最后得到的 Path 对象是相对于原始路径的相对路径。为了更好地理解,下面用几个简单的例子来说明,假设有下面两个路径:[code="j...2014-03-25 15:09:55 · 92 阅读 · 0 评论 -
[NIO.2] 第六篇 合并两个 Path 对象
合并两个 Path 对象可以方便你先定义一个根路径,然后再在后面添加其它的路径。当你需要使用公共路径的时候,这个功能相当有用。NIO.2 提供了 resolve() 方法来支持这个功能。下面看看例子:[code="java"]//define the fixed path Path base = Paths.get("C:/rafaelnadal/tournaments/2009");...原创 2014-03-24 17:23:01 · 143 阅读 · 0 评论 -
[NIO.2] 第五篇 Path 对象的转换
本文中,你将可以看到如何将 Path 对象转换为其它对象。本文所有例子都是基于下面的 Path 对象:[code="java"]Path path = Paths.get("/rafaelnadal/tournaments/2009", "BNP.txt");[/code][b][size=x-large]将 Path 转换为 String[/size][/b]可以直接使用...2014-03-24 17:20:50 · 226 阅读 · 0 评论 -
[NIO.2] 第四篇 从 Path 对象获取信息
在定义了 Path 对象后,你就可以调用它上面的一系列方法获取关于文件路径的有用信息。这些方法都基于一个前提条件,就是 NIO.2 将路径字符串分隔为一个个的元素(每个元素表示一个目录或文件的子路径),并且将元素由高到低分配索引 0 到 n-1(n 指元素的个数)。一般情况下,根下的第一个目录将会分配索引 0,随后索引递增。本文的例子都是基于 C:\rafaelnadal\tournaments\...2014-03-24 17:18:28 · 272 阅读 · 0 评论 -
[NIO.2] 第三篇 定义 Path 类
一旦确认了文件系统上的一个文件或目录,那么就可以定义一个 Path 类来指向它。定义 Path 类可以使用绝对路径、相对路径、路径中带有一个点号“.”(表示当前目录)、路径中带有两个点“..”(表示上一层目录)等。定义 Path 类最简单的方法是调用辅助类 Paths 的 get() 方法。下面将介绍使用不同的方式来得到 C:\rafaelnadal\tournaments\2009\BNP.tx...原创 2014-03-24 17:12:44 · 101 阅读 · 0 评论 -
[NIO.2] 第二篇 NIO.2 和 Path 类简介
想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.file.Path 类。这个类是 NIO.2 的里程碑,所有应用程序中的 I/O 操作都和这个类密不可分。这个类几乎可以说是 NIO.2 中最常用的类。[b][size=x-large]Path ...原创 2014-03-23 23:47:34 · 111 阅读 · 0 评论 -
[NIO.2] 第十篇 NIO.2 中的文件属性
如果对于文件或目录还有疑问,例如文件是否隐藏、当前对象是文件还是目录、文件占用多少磁盘空间、文件拥有者是谁、等等。这一切问题都可以从文件元数据中得到。NIO.2 中的元数据就是文件属性,并且提供了 java.nio.file.attribute 包来访问元数据。因为不同的文件系统有不同的文件属性,NIO.2 将这些属性通过视图(view)进行分组,每个视图都对应特定的文件系统。一般来说,视...2014-03-26 14:15:51 · 132 阅读 · 0 评论 -
[NIO.2] 第十二篇 NIO.2 属性视图之 Basic View
大多数的文件系统都支持一些通用文件属性(文件大小、文件创建时间、最后访问时间、最后编辑时间、等等)。这些通用属性都被分组到 BasicFileAttributeView 中,下面将介绍如何读取和设置这些属性。[b][size=x-large]使用 readAttributes() 方法批量获取属性[/size][/b]可以通过调用 readAttributes() 方法来批量读取...2014-03-27 14:56:46 · 106 阅读 · 0 评论 -
[NIO.2] 第十九篇 软链接与硬链接
对于 Unix 用户(特别是管理员)来说,要非常熟悉链接的概念。链接分为两种:软链接(符号链接)和硬链接。如果你是 Windows 用户,可能对链接不是很熟悉,但是 Windows 系统却完全支持它们,尤其是软链接,在 Windows 中通常叫做快捷方式。NIO.2 同时支持这两种链接,每个 Path 类的方法都能判断当前文件是否为链接,并且按你的要求做相应的处理。[b][size=x...2014-03-30 17:54:21 · 96 阅读 · 0 评论 -
[NIO.2] 第十八篇 用户自定义属性视图
如果你发现 NIO.2 内置的属性视图不能满足你的要求,或者你想给文件设置某些特殊的属性,那么你可以使用自定义属性视图。NIO.2 提供了 UserDefinedFileAttributeView 接口来支持这个功能。使用这个视图,你可以添加任何你认为有用的文件属性。[b][size=x-large]检查是否支持自定义文件属性[/size][/b]在你要创建自己的文件属性之前,要先...2014-03-29 20:00:16 · 308 阅读 · 0 评论 -
[NIO.2] 第十七篇 读取文件存储设备的属性
如果将电脑看作文件存储的容器,那么有很多类型的文件存储,例如:分区、硬盘、卷标,等等。NIO.2 中可以通过 FileStore 这个抽象类来得到每种类型的文件存储信息。你可以获取文件存储的名字、类型、总空间、已用空间和剩余空间。获得所有文件存储的属性首先调用 FileSystems.getDefault() 方法获取默认文件系统,然后再调用 FileSystem.getFileSt...2014-03-29 14:43:38 · 109 阅读 · 0 评论 -
[NIO.2] 第十六篇 属性视图之 ACL View
一个访问控制列表(ACL)就是一组用来精确控制访问文件的权限列表。ACL 控制着文件所有者、权限、以及各种类型的文件标识。NIO.2 提供了 AclFileAttributeView 来支持 ACL。[b][size=x-large]使用 Files.getFileAttributeView() 获取 ACL[/size][/b]如果你没有见过 ACL 的内容,可以试试下面这段代码...2014-03-29 13:36:46 · 147 阅读 · 0 评论 -
[NIO.2] 第十五篇 属性视图之 POSIX View
对于 Unix 用户来说是个好消息!POSIX 视图扩展 Basic 视图并支持 Unix 及其它相关操作系统。POSIX 视图支持文件所有者、组拥有者、以及九个访问权限。基于 PosixFileAttributes 类,可以通过下面的方式得到 POSIX 属性:[code="java"]import java.io.IOException; import java.nio.fil...2014-03-28 19:59:00 · 302 阅读 · 0 评论 -
[NIO.2] 第十四篇 属性视图之 File Owner View
大多数文件系统都有文件所有者的概念,并且决定了访问文件系统对象的权限。在 NIO.2 中,提供了 UserPrincipal 接口来关联文件所有者这个概念,并且提供了 FileOwenerAttributeView 接口来设置和读取文件所有者。注:在本文的例子中使用的文件所有者名称为“apress”,但是在你的系统上可能没有这个用户。运行测试代码的时候会抛出 java.nio.file.a...2014-03-28 18:18:56 · 351 阅读 · 0 评论 -
[NIO.2] 第十三篇 属性视图之 DOS View
为了支持 DOS(或 Samba) 文件系统,DosFileAttributeView 属性视图扩展了 Basic 属性视图(意味着 DOS 属性视图是 Basic 属性视图的子类,可以直接访问父类的属性)。DOS 属性视图提供了四个属性,对应下面的四个方法:isReadOnly(): 返回只读属性值(true 表示文件不能被删除或修改)isHidden(): 返回文件是否隐藏的属性(tr...原创 2014-03-27 16:31:14 · 133 阅读 · 0 评论 -
[NIO.2] 第十一篇 判断文件系统所支持属性视图
在访问文件属性之前,需要确保文件系统支持你所使用的属性视图。NIO.2 中可以获取文件系统所支持的属性视图名称列表,也可以通过 FileStore 类来检验文件存储是否支持某个属性视图。通过调用 FileSystems.getDefault() 可得到当前的默认文件系统,调用 FileSystem.supportedFileAttributeViews() 方法可得到文件系统支持的属性视图列表...2014-03-27 16:28:03 · 150 阅读 · 0 评论