File类的源码学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了File类的源码学习相关的知识,希望对你有一定的参考价值。


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类的源码学习的主要内容,如果未能解决你的问题,请参考以下文章

从静态代码扫描引擎PMD源码学习-多线程任务模型和File过滤设计

python中类的学习笔记(源码版)

C语言100个经典算法源码片段

阅读JDK源码后,我有了优化它的冲动!

PHP常用代码片段

Java File类的学习