[重学Java基础][Java IO流][Part.13]文件操作类File

[重学Java基础][Java IO流][Part.13]文件操作类File

File

概述

File 是“文件”和“目录路径名”的抽象表示形式。
File 直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap中)。

源码解析

成员变量

    文件系统 windows视窗系统下是WinNTFileSystem类 Unix系统是UnixFileSystem
    private static final FileSystem fs = DefaultFileSystem.getFileSystem();
    路径 指文件的全路径 类似"C:/Users/Document/user.txt"
    private final String path;
    文件路径是否有效的标志
    private transient File.PathStatus status = null;
    相对路径的前缀符长度 为0则无前缀
    private final transient int prefixLength;
    Char形式的单一文件路径分隔符 win下是'\\' linux下是'/' 
    public static final char separatorChar;
    String形式的单一文件路径分隔符 win下是"\\" linux下是"/"
    匹配路径类似C:/Program Files/Common Files 
    public static final String separator;
    Char形式的多个问价路径分隔符 win下是';' unix下是':'
    public static final char pathSeparatorChar;
    String形式的多个问价路径分隔符 win下是";" unix下是":"
    匹配路径类似 test.jar;abc.jar
    public static final String pathSeparator;
    PATH_OFFSET PREFIX_LENGTH_OFFSET 这两个属性都适用于文件序列化的
    所以是私有的 外部不可获得 
    private static final long PATH_OFFSET;
    private static final long PREFIX_LENGTH_OFFSET;
    内部成员类 调用了Unsafe类进行序列化操作
    private static final Unsafe UNSAFE;
    序列化统一识别编号
    private static final long serialVersionUID = 301077366599181567L;
    配合NIO包使用 
    private transient volatile Path filePath;

成员函数

    检查文件路径是否有效 
    从代码上可以看到 这个方法并不是检测路径是否真实的
    而是检测路径是否存在值 如果为空则返回PathStatus.CHECKED
    final boolean isInvalid() {
        if (status == null) {
            status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                       : PathStatus.INVALID;
        }
        return status == PathStatus.INVALID;
    }

构造方法

    私有构造 指定路径和路径前缀长度
    此方法为File类内部调用方法 所以参数路径名
    pathname 路径前缀长度都是格式化后的正确值
    private File(String pathname, int prefixLength) {
        this.path = pathname;
        this.prefixLength = prefixLength;
    }

    私有构造 指定子路径和父路径
    此方法为File类内部调用方法 所以参数
    子路径和父路径都必须是正确的格式
    private File(String child, File parent) {
        assert parent.path != null;
        assert (!parent.path.equals(""));
        this.path = fs.resolve(parent.path, child);
        this.prefixLength = parent.prefixLength;
    }

    构造方法 指定文件路径
    public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        }
        格式化路径
        this.path = fs.normalize(pathname);
        获取路径前缀长度
        this.prefixLength = fs.prefixLength(this.path);
        }

    构造方法 指定父路径和子路径
    public File(String parent, String child) {
        if (child == null) {
            throw new NullPointerException();
        }
        if (parent != null) {
            if (parent.equals("")) {
                this.path = fs.resolve(fs.getDefaultParent(),
                                       fs.normalize(child));
            } else {
                this.path = fs.resolve(fs.normalize(parent),
                                       fs.normalize(child));
            }
        } else {
            this.path = fs.normalize(child);
        }
        this.prefixLength = fs.prefixLength(this.path);
    }

    构造方法 根据一个File类父路径和子路径创建File
    public File(File parent, String child) {
    if (child == null) {
        throw new NullPointerException();
    }
    if (parent != null) {
        if (parent.path.equals("")) {
            this.path = fs.resolve(fs.getDefaultParent(),
                                   fs.normalize(child));
        } else {
        parent是file类型的 所以直接获取path即可
            this.path = fs.resolve(parent.path,
                                   fs.normalize(child));
        }
    } else {
        this.path = fs.normalize(child);
    }
    this.prefixLength = fs.prefixLength(this.path);
}

    根据URI构造
    public File(URI uri) {

    多种情况的检查
    if (!uri.isAbsolute())
        throw new IllegalArgumentException("URI is not absolute");
    if (uri.isOpaque())
        throw new IllegalArgumentException("URI is not hierarchical");
    String scheme = uri.getScheme();
    if ((scheme == null) || !scheme.equalsIgnoreCase("file"))
        throw new IllegalArgumentException("URI scheme is not \"file\"");
    if (uri.getRawAuthority() != null)
        throw new IllegalArgumentException("URI has an authority component");
    if (uri.getRawFragment() != null)
        throw new IllegalArgumentException("URI has a fragment component");
    if (uri.getRawQuery() != null)
        throw new IllegalArgumentException("URI has a query component");
    String p = uri.getPath();
    if (p.equals(""))
        throw new IllegalArgumentException("URI path component is empty");

    检查正确 进行初始化
    p = fs.fromURIPath(p);
    if (File.separatorChar != '/')
        p = p.replace('/', File.separatorChar);
    this.path = fs.normalize(p);
    this.prefixLength = fs.prefixLength(this.path);
}

其他方法

剩余的方法 起源吗大部分是和执行平台相关的本地方法
所以看不到源码

这三个都是本地方法
boolean    canExecute()    是否可以执行此路径文件
boolean    canRead()       是否可以读取此路径文件。
boolean    canWrite()      是否可以写入此路径文件
按字母顺序比较两个抽象路径名
内部调用了FileSystem的比较方法
实际上调用的是下面的compare方法
public int compareTo(File pathname) {
    return fs.compare(this, pathname);
}  

可以看到其实是进行的字符串字母顺序比较
public int compare(File f1, File f2) {
    return f1.getPath().compareToIgnoreCase(f2.getPath());
}

下面这些都是本地方法

boolean createNewFile()   当且仅当当前文件不存在时 创建一个新的空文件

static File createTempFile(String prefix, String suffix) 
在默认临时文件目录中创建一个空文件,使用给定前缀prefix和后缀suffix作为名称

static File createTempFile(String prefix, String suffix, File directory)    
在指定目录directory中创建一个新的空文件,使用给定前缀prefix和后缀suffix作为名称

boolean    delete() 删除此File对象表示的文件或目录

void    deleteOnExit()      退出程序时,删除此File对象表示的文件或目录

boolean    equals(Object obj)   此File对象与给定对象是否相等

boolean    exists()      此File对象表示的文件或目录是否存在

File    getAbsoluteFile()    获取此File对象的绝对路径

String    getAbsolutePath()   获取此File对象的绝对路径名字符串。

File    getCanonicalFile()   获取此File对象的规范形式。

String    getCanonicalPath()   获取此File对象的规范路径名字符串。

long    getFreeSpace()       获取此File对象指定的内存分配空间中中未分配的字节数。

String    getName()         获取此File对象表示的文件或目录的名称。

String    getParent()      获取此File对象父目录的路径名字符串 如果此File对象没有父目录,则返回 nullFile    getParentFile()     获取此File对象父目录的File对象;如果此路径名没有指定父目录,则返回 nullString    getPath()         获取此File对象的一个路径名字符串。

long    getTotalSpace()      获取此File对象的内存分配空间大小。

long    getUsableSpace()     获取此File对象的内存分配空间未使用的部分的大小。

boolean    isAbsolute()      此File对象是否为绝对路径名。

boolean    isDirectory()     此File对象是否是一个目录。

boolean    isFile()          此File对象是否是一个标准文件。

boolean    isHidden()        此File对象是否是一个隐藏文件。

long    lastModified()       获取此File对象表示的文件最后一次被修改的时间。

long    length()             获取此File对象表示的文件的长度。

String[]    list()  获取一个字符串数组,每个数组对象代表一个此File对象表示的目录中的文件和目录。

String[]    list(FilenameFilter filter)  
获取一个字符串数组,每个数组对象代表一个此File对象表示的目录中的文件和目录,且符合filter的过滤规则

File[]    listFiles()  获取一个字符串数组,每个数组对象代表一个此File对象表示的目录中的文件

File[]    listFiles(FileFilter filter)   
获取一个字符串数组,每个数组对象代表一个此File对象表示的目录中的文件,且符合filter的过滤规则

File[]    listFiles(FilenameFilter filter)  
获取抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

static File[]    listRoots()  获取可用的文件系统根。

boolean    mkdir()     创建指定的目录

boolean    mkdirs()    创建指定的目录,如果有必须的父目录 则同时创建

boolean    renameTo(File dest) 重新命名此File对象路径名表示的文件

boolean    setExecutable(boolean executable)  
设置此抽象路径名所有者执行权限的一个便捷方法

boolean    setExecutable(boolean executable, boolean ownerOnly)  
设置此抽象路径名的所有者或所有用户的执行权限

boolean    setLastModified(long time)     设置此此File对象指定的文件或目录的最后一次修改时间

boolean    setReadable(boolean readable)  设置此此File对象所有者读权限的一个便捷方法
boolean    setReadable(boolean readable, boolean ownerOnly) 设置此File对象的所有者或所有用户的读权限

boolean    setReadOnly()     设置此File对象代表的文件或目录 从而只能对其进行读操作

boolean    setWritable(boolean writable)  设置此File对象代表的文件或目录所有者写权限的一个便捷方法

boolean    setWritable(boolean writable, boolean ownerOnly) 
设置此File对象代表的文件或目录 的所有者或所有用户的写权限

String    toString()  返回此File对象的路径名字符串
URI    toURI() 构造一个表示此抽象路径名的 file: URI。

猜你喜欢

转载自blog.csdn.net/u011863951/article/details/80370555