关于文件的INode与Java中的文件操作接口

美不胜收
• 阅读 1407

本文由作者周梁伟授权网易云社区发布。

近日做的项目中涉及到多进程共同读写多个文件的问题,文件名和最后修改时间都是可能会被频繁修改的,因而识别文件的唯一性会产生相当的麻烦,于是专门再学习了一下文件系统对文件的组织管理方式。

一、 文件在文件系统中的组织方式
一块物理磁盘可以被分为若干个分区,分区的初始化操作就是在上面建立文件系统,如ext3,ext4,ntfs或fat32等都是文件系统的概念,还有网络文件系统如NFS等。同块磁盘上的不同分区也可以被指定不同的文件系统,文件系统对文件在磁盘上的数据读写方式做了抽象。一个文件系统中又被分为多个卷(Cylinder Group),每个卷中最主要的部分是inode基路段和数据块段。i-node结构唯一指定了一个文件实例,这个数据结构中包括了inode编号,所有包含的数据块的信息和该inode被引用的计数等。可以这么认为,要唯一识别的一个磁盘上的文件,只需要获得inode-number就可以了。文件或者目录则是存放在数据块中directory block,其中包含了文件名和实体文件的inode-number等信息。文件名是可以随时被改变的,只要其中的inode-number没有发生改变,则指向的就是同一个文件。所以在应用程序中要判断文件是否相同如果依靠filename是不可靠的,只有获取到文件的inode-number才是可靠的。如在log4j这种日志应用中,日志文件的归档方式会使文件名不断发生变化,当前你less到的app.log在下一分钟可能就变成了app.log.1。在这种场景下,程序只能通过获取文件inode-number来识别文件。

关于文件的INode与Java中的文件操作接口

关于文件的INode与Java中的文件操作接口

二、 文件操作
前面说了文件在磁盘上的存放是以inode-number为唯一id来区分的,在进程打开一个文件读写时,操作系统又会为文件分配一个"指针"来访问文件,而不是直接使用inode-number。这个指针就是FileDescriptor(下面简称FD),FD是一个动态的概念,是进程中调用create后open文件操作是返回的一个Long值,当文件关闭时这个FD也就失效了,所以同一个文件如果被打开两次获取到的FD会是不同的。进程打开文件的情况如下图所示,在进程中维护了一张表记录所有打开的文件,每一条记录表示一个FileDescriptor,每个进程在开始时都默认打开了三个文件,FileDescriptor分别是0,1,2,既stdin, stdout和stderr。FD记录中包含了一张FileTable,记录了文件的状态信息,offset和V-node指针,V-Node指针才真正指向了磁盘上的文件实体。(这里的V-Node是在inode之上抽象出来的概念,因为i-node在不同的文件系统中会有实现上的差异,V-Node是为了统一不同文件系统的接口抽象出来的一层,在Linux中V-Node被称为 FileSystem independent INode ,而INode 称为FileSystem dependent Inode,我们可以简单的理解为 V-Node就是INode)。

关于文件的INode与Java中的文件操作接口

当一个文件被多个进程共享读写时,可以看如下图:

关于文件的INode与Java中的文件操作接口

这里进程A的fd3和进程B的fd4其实指向的是同一个实体文件,但是这两个进程维护了两张不同的文件表,维护了不同的offset位置。所以如果进程不是采用append方式写文件,两个进程写入的内容可能出现相互覆盖。这里也可能看到虽然FD不同,但是可以指向同一个实体文件,也说明了用FD来判断文件唯一性是不靠谱的。
关于FD和INode,还有关于缓存的重要注意事项。
由于操作系统在接收到文件写请求时可能将写入内容放到缓存中,所以提供了flush和sync等操作来将缓存中的内容强制刷入磁盘。但是这两个操作作用是不同的。
flush会将数据刷入到FileDescriptor中,但是不会刷入Inode
sync/fsync/fdatasync则会强制将FD中的数据刷入Inode中。

三、 Java操作文件的接口
关于文件的INode与Java中的文件操作接口

最后需要注意的一点是,虽然在文件的存续期间,inode可以认为是识别该文件的唯一标识,但是文件系统对inode有回收重用的机制,在文件被删除之后,原来的inode可以被分配给新创建的文件,这种情况下,如果一味以inode相同来判定新旧文件是不是同一个文件可能会出现错误;应对这种情况确实也没有更好的办法,一种解决方法是,提取文件中部分内容的MD5或SHA-1这种指纹信息作为标识,以inode+md5是否相同来决定是否是同个文件。

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请访问网易云社区。

文章来源: 网易云社区

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java程序中获取kerberos登陆hadoop
本文由作者周梁伟授权网易云社区发布。一般我们在使用kbs登陆hadoop服务时都直接在shell中调用kinit命令来获取凭证,这种方式简单直接,只要获取一次凭证之后都可以在该会话过程中重复访问。但是这种方式一个明显的问题就是如果在本次shell中会间隔调用不同的java程序,而这些程序需要访问不同权限的问题,需要在访问前调用各自的ktab文件获
常见的授权错误及原因
在日常的皕杰报表使用中,我们可能会遇到一些授权错误,下面是一些授权错误及造成的原因。1、BIOSREPORT1151可能是license文件没有找到,或license文件内容被修改了2、BIOSREPORT11521155license文件错误,可能是文件内容被修改了3、BIOSREPORT1161当前的系统日期不在授权日期范围内4、BIOSREPO
Wesley13 Wesley13
3年前
Ubuntu的Linux逻辑卷管理
LVM(逻辑卷)管理系统可以将多个物理磁盘组装为一个大的逻辑磁盘进行使用,尤其是管理大文件时非常方便。LVM可以减少多个磁盘的部分空间闲置的情况,集中使用提高磁盘利用率。LVM的卷可以动态伸缩,方便使用。LVM由PV(物理卷)、VG(卷组)、LV(逻辑卷)组成,其中PV对应到物理磁盘的一个物理分区,LV相当于一个逻辑分区,VG建立起逻辑卷和物理卷之间的对
Wesley13 Wesley13
3年前
MAC 中该磁盘不能被分区,因为文件系统验证失败错误代码8
MAC中该磁盘不能被分区,因为文件系统验证失败错误代码8磁盘修复操作失败,因为文件系统验证失败错误代码8手贱mac磁盘分区时间加密了磁盘跟主磁盘密码不一致分区修复提示:MAC中该磁盘不能被分区,因为文件系统验证失败错误代码8解决方案:一直按住CommandS键启动到单用户模式。10.12以上出现登陆,输入密码即可系统自动进入
Stella981 Stella981
3年前
Docker 镜像
我们都知道,操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套Ubuntu18.04最小系统的 root 文件系统。Docker镜像是一个
Stella981 Stella981
3年前
Apache Hudi重磅RFC解读之记录级别全局索引
1\.摘要Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中。当前Hudi支持分区和非分区的数据集。分区数据集是将一组文件(数据)放在称为分区的桶中的数据集。一个Hudi数据集可能由N个分区和M个文件组成,这种组织结构也非常方便hive/presto/sp
inode节点扩容
本文分享自天翼云开发者社区《》,作者:2m1.inode概述在Linux系统中,每个文件和目录都有一个对应的inode节点,用于存储文件或目录的元数据信息,如:文件大小、创建时间、修改时间、权限等。当文件或目录被创建时,系统会为其分配一个inode节点。然
Stella981 Stella981
3年前
Linux系统文件管理基础
Linux系统文件管理基础一、Linux系统文件系统1.1Linux文件系统结构!img(http://qjz2nkh4a.hnbkt.clouddn.com/20201201205143.png)在Linux系统中,目录被组织成一个:单根倒置树结构,文件系统从根目录开始,用/来表示。文件
Wesley13 Wesley13
3年前
3.每日一个Linux命令
描述:创建一个新的文件,当被创建的文件存在时,则改变文件的时间戳。用法:touch\acmdtr\文件名常用选项:\a:修改文件的访问时间;\c:仅用来修改文件的时间,如果目标文件不存在,不会创建新的文件。与nocreate效果一样;\m:修改文件的修改时间;\d:后面接日期,也可以使用date"日期或时
Stella981 Stella981
3年前
Perl文件、目录常用操作
注意,这些操作的对象是文件名(相对路径/绝对路径),而非文件/目录句柄,句柄只是perl和文件系统中文件的关联通道,而非实体对象。创建文件在unix类操作系统中有一个touch命令可以非常方便的创建文件,还能批量创建一些名称规律的文件。但实际上touch的主要介绍中却是"修改文件时间戳",创建文件只不过是它的辅助能力。如果没有touch命令
Wesley13 Wesley13
3年前
2.4、Python文件对象及os、os.path和pickle模块(0530)
文件系统和文件1、文件系统是OS用于明确磁盘或分区上的文件的方法和数据结构即在磁盘上组织文件的方法;文件系统模块:os2、计算机文件(称文件、电脑档案、档案),是存储在某种长期储存设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下;3、概括来讲:文件是计算机中由OS管理的具有名字的存储区域;