File類的源碼學習
阿新 • • 發佈:2017-11-19
pri path prefix platform field window fin 兩個 extends
File類是Java中IO部分的一個類,用於表示文件或者目錄的。關於File類有很多的常規操作這裏就不介紹了,來看一下不常規的東西。
File英文意思是文件,但是它也可以用來表示目錄,文件的概念還是比較廣的。
public class File implements Serializable, Comparable<File>
File類實現的Comparable接口
File類實現了Serializable和Comparable接口,可是為什麽要實現Comparable接口呢?
/** * 比較兩個抽象路徑的字典序. 比較的結果依賴於底層的文件系統. * 在UNIX上路徑是大小寫敏感的, 在Microsoft Windows系統上則不是. * * @param pathname The abstract pathname to be compared to this abstract * pathname * * @return Zero if the argument is equal to this abstract pathname, a * value less than zero if this abstract pathname is * lexicographically less than the argument, or a value greater * than zero if this abstract pathname is lexicographically * greater than the argument * * @since 1.2*/ public int compareTo(File pathname) { return fs.compare(this, pathname); }
這就要看一下接口中的方法是幹啥的。然後這就要和文件系統有關系。
其中有個fs.compare(),這個是文件系統對象的比較方法
File類中有一個關於文件系統的引用
abstract class FileSystem; // 一個抽象類表示文件系統
然後一個類是DefaultFileSystem,這個類中有一個靜態方法返回本地默認的文件系統。
class DefaultFileSystem { /** * Return the FileSystem object for Windows platform.*/ public static FileSystem getFileSystem() { return new WinNTFileSystem(); } }
然後這個WinNTFileSystem繼承的是抽象的FileSystem:
class WinNTFileSystem extends FileSystem;
WinNTFileSystem的compare方法為:
@Override public int compare(File f1, File f2) { return f1.getPath().compareToIgnoreCase(f2.getPath()); }
final和static配合使用
final表示的對象是不可變的,但是有時候我們需要根據情況來初始化final屬性。這裏在File類中用的方法就是static代碼段。
private static final long PATH_OFFSET; private static final long PREFIX_LENGTH_OFFSET; private static final sun.misc.Unsafe UNSAFE; static { try { sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); PATH_OFFSET = unsafe.objectFieldOffset( File.class.getDeclaredField("path")); PREFIX_LENGTH_OFFSET = unsafe.objectFieldOffset( File.class.getDeclaredField("prefixLength")); UNSAFE = unsafe; } catch (ReflectiveOperationException e) { throw new Error(e); } }
前面三個final屬性沒有在定義的時候進行初始化,而是在static代碼中進行的。這個可以借鑒一下哦。
File類的源碼學習