目录
NIO.2概述
NIO.2在JDK1.7中发布,针对原有的文件IO操作进行了优化及封装,并支持Asynchronous IO。从Java IO详细总结(源码解析)、Java NIO详细总结(源码解析)这两篇文章中可以看到在针对文件进行操作时不管是IO还是NIO都需要搭配File,通过File来跟OS关联。而在NIO.2中围绕着文件系统提出了三大概念FileSystem,Path,Symbolic Links也是本文的核心内容,下面将逐一介绍。需要注意的是本文跟Java IO详细总结(源码解析)、Java NIO详细总结(源码解析)一样,只讨论文件IO至于网络IO会在其他文章中展开。
文件系统
在开始介绍NIO.2之前先来了解下什么是文件系统(File System)。文件系统在某种形式的媒体(通常是一个或多个硬盘)上存储和组织文件,以便于检索。目前使用的大多数文件系统都将文件存储在树(或层次结构)结构中。树的顶部是一个(或多个)根节点。在根节点下,有文件和目录(Microsoft Windows中的文件夹)。每个目录都可以包含文件和子目录,而这些文件和子目录又可以包含文件和子目录,潜在的深度几乎是无限的。一般常见的就是Windows以及UNIX系统,下面是一个常见的文件系统结构图:
对于Windows系统来说有分区的概念,文件系统的根节点可以是任意一个分区,而在UNIX系统中文件系统都是从/开始。拿test来说在Windos中的文件路径就是C:\data\test,对于UNIX就是/data/test。NIO.2中通过类Path来表示文件系统中的路径,其中路径又分为绝对路径以及相对路径:
- 绝对路径:绝对路径一定带着根路径,例如/data/test就是一条完整的文件路径通过它可以找到对应的文件;
- 相对路径:相对路径不是完整的文件路径例如data/test,它需要跟根目录/配合成一条完整的路径才能够找到对应文件。
需要注意的是在Java中你可以随意构建一个Path实例,但是该对象对应的文件不一定存在于文件系统中,需要通过Files类来校验是否存在。
在文件系统中值得一提的还有符号链接(Symbolic Link),符号链接指的是在文件系统中文件可以指向其他文件,在这个过程中源文件只是起到一个指向性的作用(指向目标文件)即路径C:\data\test与C:\etc\test访问的都是同一个文件test2,如下图所示: