1904 2018-04-07 2020-06-25

前言:Java提供的File类不仅支持文件管理,还支持其他语言所不支持的目录管理。

一、构造方法

File类有几个构造方法,我们一个个看。

1、 File(String pathname)

构造方法代码如下

private static final FileSystem fs = DefaultFileSystem.getFileSystem();

public File(String pathname) {
    if (pathname == null) {
        throw new NullPointerException();
    }
    // 修正路径字符,使之符合当前系统的标准,如windows中的分隔符为\,会替代字符串中的/
    this.path = fs.normalize(pathname);
    // 获取抽象路径的前缀,为FileSystem类所用
    this.prefixLength = fs.prefixLength(this.path);
}

class DefaultFileSystem {
    /**
     * Return the FileSystem object for Windows platform.
     */
    public static FileSystem getFileSystem() {
        return new WinNTFileSystem();
    }
}

2、父目录+子文件

  • File(String parent, String child)
  • File(File parent, String child)
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);
}

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 {
            this.path = fs.resolve(parent.path,
                                   fs.normalize(child));
        }
    } else {
        this.path = fs.normalize(child);
    }
    this.prefixLength = fs.prefixLength(this.path);
}

3、File(URI uri)

public File(URI uri) {
    // Check our many preconditions
    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.getAuthority() != null)
        throw new IllegalArgumentException("URI has an authority component");
    if (uri.getFragment() != null)
        throw new IllegalArgumentException("URI has a fragment component");
    if (uri.getQuery() != null)
        throw new IllegalArgumentException("URI has a query component");
    String p = uri.getPath();
    if (p.equals(""))
        throw new IllegalArgumentException("URI path component is empty");
    // Okay, now initialize
    p = fs.fromURIPath(p);
    if (File.separatorChar != '/')
        p = p.replace('/', File.separatorChar);
    this.path = fs.normalize(p);
    this.prefixLength = fs.prefixLength(this.path);
}

二、构造方法的使用

代码如下

public static void main(String[] args) throws IOException, URISyntaxException {
    File file = new File("html/file.txt");// 在相对路径下
    printFile(file);
    System.out.println("是否成功创建文件:" + file.createNewFile());
    // 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
    // 是否成功创建文件:false

    File file1 = new File("\\html\\file.txt");//在根目录下,需要注意两者之间的区别
    printFile(file1);
    // 文件:file.txt , 是否存在:false ,绝对路径:D:\html\file.txt

    File file2 = new File("html", "file.txt");
    printFile(file2);
    File file3 = new File(new File("html"), "file.txt");
    printFile(file3);
    // 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
    // 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt

    File file4 = new File("html/file.txt");
    File file5 = new File("/html/file.txt");
    System.out.println(file4.toURI());
    System.out.println(file5.toURI());
    File file44 = new File(file4.toURI());
    File file55 = new File(file5.toURI());
    printFile(file44);
    printFile(file55);
    // 输出结果
    // file:/D:/IDEA_WORKSPACE/xiaokui/html/file.txt
    // file:/D:/html/file.txt
    // 文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
    // 文件:file.txt , 是否存在:false ,绝对路径:D:\html\file.txt
}

private static void printFile(File file) {
    System.out.println("文件:" + file.getName() + " , 是否存在:" + file.exists() + " ,绝对路径:" + file.getAbsolutePath());
}

三、常用方法

1、创建文件

如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false。不能创建文件夹。

public boolean createNewFile() throws IOException {
    SecurityManager security = System.getSecurityManager();
    if (security != null) security.checkWrite(path);
    if (isInvalid()) {
        throw new IOException("Invalid file path");
    }
    return fs.createFileExclusively(path);
}

2、创建文件夹

  • 创建此抽象路径名指定的目录。
  • 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
public boolean mkdir() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.createDirectory(this);
}

public boolean mkdirs() {
    if (exists()) {
        return false;
    }
    if (mkdir()) {
        return true;
    }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e) {
        return false;
    }

    File parent = canonFile.getParentFile();
    return (parent != null && (parent.mkdirs() || parent.exists()) &&
            canonFile.mkdir());
}

3、删除文件或文件夹

  • 删除此抽象路径名表示的文件或目录。
  • 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
public boolean delete() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkDelete(path);
    }
    if (isInvalid()) {
        return false;
    }
    return fs.delete(this);
}

public void deleteOnExit() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkDelete(path);
    }
    if (isInvalid()) {
        return;
    }
    DeleteOnExitHook.add(path);
}

4、遍历文件夹

  • 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
  • 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
public String[] list() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return null;
    }
    return fs.list(this);
}

public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
}

5、查看文件大小

此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在或为文件夹,则返回 0L

public long length() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return 0L;
    }
    return fs.getLength(this);
}

四、实用方法

1、创建临时文件

  • 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
  • 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
public static File createTempFile(String prefix, String suffix)
    throws IOException
{
    return createTempFile(prefix, suffix, null);
}

public static File createTempFile(String prefix, String suffix,
                                  File directory)
    throws IOException
{
    if (prefix.length() < 3)
        throw new IllegalArgumentException("Prefix string too short");
    if (suffix == null)
        suffix = ".tmp";
    File tmpdir = (directory != null) ? directory
                                      : TempDirectory.location();
    SecurityManager sm = System.getSecurityManager();
    File f;
    do {
        f = TempDirectory.generateFile(prefix, suffix, tmpdir);
        if (sm != null) {
            try {
                sm.checkWrite(f.getPath());
            } catch (SecurityException se) {
                // don't reveal temporary directory location
                if (directory == null)
                    throw new SecurityException("Unable to create temporary file");
                throw se;
            }
        }
    } while ((fs.getBooleanAttributes(f) & FileSystem.BA_EXISTS) != 0);

    if (!fs.createFileExclusively(f.getPath()))
        throw new IOException("Unable to create temporary file");
    return f;
}

测试代码如下

private static void testTemp() throws IOException {
    File file = File.createTempFile("test2", ".txt", null);
    printFile(file);
    file.deleteOnExit();// 相对应的,退出时删除文件(一般针对临时文件)
    printFile(file);
    // 文件:test28224588838175085107.txt , 是否存在:true ,绝对路径:C:\Users\MAIBEN~1\AppData\Local\Temp\test28224588838175085107.txt
    // 文件:test28224588838175085107.txt , 是否存在:true ,绝对路径:C:\Users\MAIBEN~1\AppData\Local\Temp\test28224588838175085107.txt
}

private static void printFile(File file) {
    System.out.println("文件:" + file.getName() + " , 是否存在:" + file.exists() + " ,绝对路径:" + file.getAbsolutePath());
}

2、重命名(移动)

重新命名此抽象路径名表示的文件。

public boolean renameTo(File dest) {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(path);
        security.checkWrite(dest.path);
    }
    if (dest == null) {
        throw new NullPointerException();
    }
    if (this.isInvalid() || dest.isInvalid()) {
        return false;
    }
    return fs.rename(this, dest);
}

测试代码如下

private static void rename() throws IOException {
    // 同目录下重命名
    File file = new File("html/file.txt");
    file.createNewFile();
    File file1 = new File("html/file-copy.txt");
    renameFile(file, file1);

    // 不同目录下重命名,等同于移动
    File file2 = new File("html/html/file-copy-copy.txt");
    renameFile(file1, file2);
    file2.deleteOnExit();
}

private static void renameFile(File file, File file1) {
    printFile(file);
    printFile(file1);
    System.out.println("重命名成功?" + file.renameTo(file1));
    printFile(file);
    printFile(file1);
}
输出结果如下
文件:file.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
文件:file-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
重命名成功?true
文件:file.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file.txt
文件:file-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt

文件:file-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
文件:file-copy-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\html\file-copy-copy.txt
重命名成功?true
文件:file-copy.txt , 是否存在:false ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\file-copy.txt
文件:file-copy-copy.txt , 是否存在:true ,绝对路径:D:\IDEA_WORKSPACE\xiaokui\html\html\file-copy-copy.txt

3、分区信息

  • 分区的大小,以字节为单位;如果此抽象路径名没有指定分区,则返回 0L。
  • 返回此抽象路径名指定的分区中未分配的字节数。
public long getTotalSpace() {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
        sm.checkPermission(new RuntimePermission("getFileSystemAttributes"));
        sm.checkRead(path);
    }
    if (isInvalid()) {
        return 0L;
    }
    return fs.getSpace(this, FileSystem.SPACE_TOTAL);
}

public long getFreeSpace() {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
        sm.checkPermission(new RuntimePermission("getFileSystemAttributes"));
        sm.checkRead(path);
    }
    if (isInvalid()) {
        return 0L;
    }
    return fs.getSpace(this, FileSystem.SPACE_FREE);
}

System.out.println(file2.getTotalSpace() / 1024 / 1024 / 1024);// 自动转型为int
System.out.println(file2.getFreeSpace() / 1024f / 1024 / 1024);// 转型为float
总访问次数: 258次, 一般般帅 创建于 2018-04-07, 最后更新于 2020-06-25

进大厂! 欢迎关注微信公众号,第一时间掌握最新动态!