码迷,mamicode.com
首页 > 其他好文 > 详细

File类的源码学习

时间:2017-11-18 23:37:10      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:file path   关于   mic   imp   this   java   概念   end   pat   


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类的源码学习

标签:file path   关于   mic   imp   this   java   概念   end   pat   

原文地址:http://www.cnblogs.com/tuhooo/p/7858255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!