1. 程式人生 > >File類的源碼學習

File類的源碼學習

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類的源碼學習