Java中如何獲得文件的inode信息
來源:程序員人生 發(fā)布時間:2015-01-26 09:24:06 閱讀次數(shù):3233次
熟習(xí)Linux操作系統(tǒng)的同學(xué)應(yīng)當知道Linux文件系統(tǒng)采取了inode - block的結(jié)構(gòu)來表示和存儲文件,inode包括了文件的元數(shù)據(jù)信息,block存儲實際的文件內(nèi)容。Linux把1切的IO都抽象成文件,那末目錄和普通文件1樣,也都是文件。每一個文件都有1個唯1的inode號。
可以用stat命令來查看1個文件的inode信息,比以下面這個文件 stat log.txt

可以看到Device是16777219d, inode號是1821216。這個文件內(nèi)容是空的,所以Blocks為0
把這個log.txt 重命名為log2.txt,再履行stat log2.txt,可以看到只有文件名變了,其他的inode號這些元數(shù)據(jù)都沒有變。

實際上普通文件的inode數(shù)據(jù)結(jié)構(gòu)只存儲1些元數(shù)據(jù),不存儲文件名的信息。那末文件名是存在哪里的呢,我們知道目錄也是1種文件,那末它也有inode和block。普通文件的block塊存儲的是文件內(nèi)容,目錄的block塊則存儲了該目錄下所有文件的inode號及對應(yīng)的文件名等信息。
所以重命名1個文件,只是修改了它所在目錄的目錄block中的文件名信息,不會對文件的inode結(jié)構(gòu)做任何修改。
既然inode這么有用,可以標識唯1的1個文件,那末Java如何獲得這個inode信息呢。由于常常會遇到判斷兩個文件是不是是同1個文件的場景。
Java NIO提供了1個BasicFileAttributes接口來取得文件的Inode信息。它提供了1個 fileKey()方法,返回1個Object,這個Object包括了文件的deviceid和 inode號,可以唯1的標識1個文件。
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());
}
}
看到結(jié)果輸出的deviceid和inode號和用Linux stat命令返回的結(jié)果是1致的
Creation Time : 2015-01⑵1T03:20:41Z
Last Access Time : 2015-01⑵1T03:38:01Z
Last Modified Time : 2015-01⑵1T03:20:41Z
Is Directory : false
Is Other : false
Is Regular File : true
Is Symbolic Link : false
Size : 0
Object Key : (dev=1000003,ino=1821216)
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈