Java中如何获得文件的inode信息

熟悉Linux操作系统的同学应该知道Linux文件系统采用了inode - block的结构来表示和存储文件,inode包含了文件的元数据信息,block存储实际的文件内容。Linux把一切的IO都抽象成文件,那么目录和普通文件一样,也都是文件。每个文件都有一个唯一的inode号。

可以用stat命令来查看一个文件的inode信息,比如下面这个文件 stat log.txt

可以看到Device是16777219d, inode号是1821216。这个文件内容是空的,所以Blocks为0

把这个log.txt 重命名为log2.txt,再执行stat log2.txt,可以看到只有文件名变了,其他的inode号这些元数据都没有变。

实际上普通文件的inode数据结构只存储一些元数据,不存储文件名的信息。那么文件名是存在哪里的呢,我们知道目录也是一种文件,那么它也有inode和block。普通文件的block块存储的是文件内容,目录的block块则存储了该目录下所有文件的inode号及对应的文件名等信息。

所以重命名一个文件,只是修改了它所在目录的目录block中的文件名信息,不会对文件的inode结构做任何修改。

既然inode这么有用,可以标识唯一的一个文件,那么Java如何获取这个inode信息呢。因为经常会遇到判断两个文件是否是同一个文件的场景。

Java NIO提供了一个BasicFileAttributes接口来获得文件的Inode信息。它提供了一个  fileKey()方法,返回一个Object,这个Object包含了文件的deviceid和 inode号,可以唯一的标识一个文件。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

public class INodeAttributes {
       public static void main(String[] args) throws Exception {
          Path path = Paths.get("/xxxxx/log.txt2");
          BasicFileAttributes bfa = Files.readAttributes(path, BasicFileAttributes.class);       
    
          System.out.println("Creation Time      : " + bfa.creationTime());
          System.out.println("Last Access Time   : " + bfa.lastAccessTime());
          System.out.println("Last Modified Time : " + bfa.lastModifiedTime());
          System.out.println("Is Directory       : " + bfa.isDirectory());
          System.out.println("Is Other           : " + bfa.isOther());
          System.out.println("Is Regular File    : " + bfa.isRegularFile());
          System.out.println("Is Symbolic Link   : " + bfa.isSymbolicLink());
          System.out.println("Size               : " + bfa.size());
          Object objectKey = bfa.fileKey();
          System.out.println("Object Key               : " + bfa.fileKey());
          
       }
    }

看到结果输出的deviceid和inode号和用Linux stat命令返回的结果是一致的

Creation Time      : 2015-01-21T03:20:41Z
Last Access Time   : 2015-01-21T03:38:01Z
Last Modified Time : 2015-01-21T03:20:41Z
Is Directory       : false
Is Other           : false
Is Regular File    : true
Is Symbolic Link   : false
Size               : 0
Object Key               : (dev=1000003,ino=1821216)
时间: 2024-10-10 23:46:54

Java中如何获得文件的inode信息的相关文章

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

java中读取特殊文件的类型

java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.indexOf(".")+1,s.length()); if(s1.indexOf(".")>0){ s1=getTypeName(s1); } else{ return s1; } return s1;} 第二种方法(利用java中自带的格式库): new Mimetyp

java中使HttpDelete可以发送body信息

java中使HttpDelete可以发送body信息RESTful api中用到了DELETE方法,android开发的同事遇到了问题,使用HttpDelete执行DELETE操作的时候,不能携带body信息,研究了很久之后找到了解决方法. 我们查看httpclient-4.2.3的源码可以发现,methods包下面包含HttpGet, HttpPost, HttpPut, HttpDelete等类来实现http的常用操作. 其中,HttpPost继承自HttpEntityEnclosingRe

Java中对XML文件的校验

Java中使用dtd校验xml文件: 1.定义一个校验类CheckXML类: import org.w3c.dom.Document; import org.xml.sax.EntityResolver;import org.xml.sax.ErrorHandler;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.SAXParseException; import java.io.

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

java中的.class文件反编译

安装Java jdk后 看安装目录里有没有jad.exe,没有要下载,一般都有的 配置Java环境变量 开始-运行-cmd-回车-进入命令行窗口: cd+空格+class文件所在路径: 按下面的命令进行反编译: 例如:[2] jad -sjava example.class 回车 在目录里可以看到example.java源文件 [1] 反编译一个class文件:jad example.class,会生成example.jad,用文本编辑器打开就是java源代码 [2] 指定生成源代码的后缀名:j

五种方式让你在java中读取properties文件内容不再是难题

一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

java中.properties属性文件的使用案例源码

一.描述 java中的.properties属性文件的正确使用可以解决很多问题,比如一个登录界面要做一个记住用户登录过的用户名和密码并且放在本地方便用户登录. 二.操作步骤 1.  打开eclipse工程文件目录下的XX.properties文件,如果没有就创建一个 2. 以键-值对的方式记录用户最近登录过的用户名--密码,添加一个键值对 3. 移除一个键-值对 4. 保存这个属性文件 5. 获取属性文件的所有键 6. 获取指定键的属性值 二.源代码 //在工作主目录下(即eclipse项目目录

java中获取所有文件--(递归调用)

import java.io.File;import java.io.*; //获取一个文件夹中的所有的文件.  /*    打印要求:      -- a.txt   -- IO.doc      -- ~$IO.doc   -- 代码   -- --.metadata   -- --Day18   --视频   -- --01 线程通信.wmv   -- --02 守护线程和join方法.wmv   -- --03 Filed的创建.wmv   -- --04 File的常用方法.wmv