整理 Java I/O (十四):文件 - File

总结完 IO 流,顺便说一下 Java 中的 File 类。

File 是文件在硬盘中的表现形式,它可以是一个具体文件,也可以是一个目录。

Let’s go

构造方法

  • File(File parent, String child)

    根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
  • File(String pathname)

    通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  • File(String parent, String child)

    根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
  • File(URI uri)

    通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

其他方法

File 提供了如下几个创建文件或目录的方法

  • createNewFile()

    当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
  • createTempFile(String prefix, String suffix)

    在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
  • createTempFile(String prefix, String suffix, File directory)

    在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
  • mkdir()

    创建此抽象路径名指定的目录。
  • mkdirs()

    创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
public class FileTest {

    public static void main(String[] args) {
        try {
            File tmpDir = new File("D:\\tmpDir");
            if (tmpDir.mkdir()) { // 创建目录
                System.out.println("创建目录成功");
            } else {
                System.out.println("创建失败");
            }

            File dirs = new File("D:\\111\\222");
            if (dirs.mkdirs()) { // 创建多层级目录
                System.out.println("创建成功");
            } else {
                System.out.println("创建失败");
            }

            File newFile = new File("D:\\newFile.txt");
            if (newFile.createNewFile()) { // 创建文件
                System.out.println("创建成功");
            } else {
                System.out.println("创建失败");
            }

            File tmpFile = File.createTempFile("aaaaa", "bbbbb"); // 在默认位置创建临时文件,文件名以aaaaa开始,以bbbbb结束,没有后缀
            System.out.println(tmpFile); // 输出C:\Users\XXXX\AppData\Local\Temp\aaaaa6643289997713284952bbbbb
                                            // 【注意】文件名中间的数字每次生成都是随机的

            File defaultTmpFile = File.createTempFile("ccccc", null); // //在默认位置创建临时文件,文件名以aaaaa开始,文件后缀是tmp
            System.out.println(defaultTmpFile); // 输出C:\Users\XXXX\AppData\Local\Temp\ccccc4170140171406117444.tmp

            File tmpFile2 = File.createTempFile("ddddd", "eeeee", tmpDir); // 在指定位置创建临时文件
            System.out.println(tmpFile2); // 输出D:\tmpDir\ddddd6304824006496248193eeeee
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java 删除文件和删除目录使用相同的方法。

  • delete()

    删除此抽象路径名表示的文件或目录。
  • deleteOnExit()

    在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
public class FileTest {

    public static void main(String[] args) {
        File file = new File("D:\\111");

        if (file.delete()) { // 删除一个文件或者目录,删除的目录需要是空目录
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }

        File file2 = new File("D:\\tmpDir\\test.txt");
        file2.deleteOnExit();    //在JVM停止时执行删除操作。

        try {
            Thread.sleep(5000);
            System.out.println("执行完毕");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

一系列的查找方法

  • compareTo(File pathname)

    按字母顺序比较两个抽象路径名。
  • equals(Object obj)

    测试此抽象路径名与给定对象是否相等。
  • exists()

    测试此抽象路径名表示的文件或目录是否存在。
  • getAbsoluteFile()

    返回此抽象路径名的绝对路径名形式。
  • getAbsolutePath()

    返回此抽象路径名的绝对路径名字符串。
  • getCanonicalFile()

    返回此抽象路径名的规范形式。
  • getCanonicalPath()

    返回此抽象路径名的规范路径名字符串。
  • getFreeSpace()

    返回此抽象路径名指定的分区中未分配的字节数。
  • getName()

    返回由此抽象路径名表示的文件或目录的名称。
  • getParent()

    返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
  • getParentFile()

    返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
  • getPath()

    将此抽象路径名转换为一个路径名字符串。
  • getTotalSpace()

    返回此抽象路径名指定的分区大小。
  • getUsableSpace()

    返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
  • hashCode()

    计算此抽象路径名的哈希码。
  • isAbsolute()

    测试此抽象路径名是否为绝对路径名。
  • isDirectory()

    测试此抽象路径名表示的文件是否是一个目录。
  • isFile()

    测试此抽象路径名表示的文件是否是一个标准文件。
  • isHidden()

    测试此抽象路径名指定的文件是否是一个隐藏文件。
  • lastModified()

    返回此抽象路径名表示的文件最后一次被修改的时间。
  • length()

    返回由此抽象路径名表示的文件的长度。
  • list()

    返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
  • list(FilenameFilter filter)

    返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
  • listFiles()

    返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
  • listFiles(FileFilter filter)

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

    返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
  • listRoots()

    列出可用的文件系统根。
public class FileTest {

    public static void main(String[] args) {
        File file = new File(
                "D:\\android-sdk-windows\\add-ons\\addon-google_apis-google-16\\manifest.ini");
        File dir = new File(
                "D:\\android-sdk-windows\\add-ons\\addon-google_apis-google-16");
        System.out.println(file.canExecute()); // 测试是否可执行...输出true
        System.out.println(file.canRead()); // 测试是否可读...输出true
        System.out.println(file.canWrite()); // 测试是否可写...输出true

        if (dir.exists()) { // 检测文件或者目录是否存在
            System.out.println("存在");
        } else {
            System.out.println("不存在");
        }

        System.out.println(dir.getAbsoluteFile());// 返回此抽象路径名的绝对路径名
        System.out.println(file.getAbsolutePath());// 返回绝对路径名字符串,它与此抽象路径名表示相同的文件或目录

        try {
            System.out.println(file.getCanonicalPath());// 规范路径名字符串,它与此抽象路径名表示相同的文件或目录
            System.out.println(dir.getCanonicalFile());// 规范路径名字符串,它与此抽象路径名表示相同的文件或目录

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(file.getFreeSpace());// 分区上的未分配字节数;可以直白的理解为分区剩余空间。

        System.out.println(file.getName());// 返回此抽象路径名表示的文件或目录的名称

        System.out.println(file.getParent());// 返回此抽象路径名指定父目录的路径名字符串;
        System.out.println(file.getParentFile());// 返回此抽象路径名指定父目录的抽象路径名;
        System.out.println(file.getPath());// 返回此抽象路径名的字符串形式

        System.out.println(file.getTotalSpace());// 返回分区的大小,以字节为单位;
        System.out.println(file.getUsableSpace());// 返回分区上的可用字节数;
        System.out.println(file.hashCode());// 返回此抽象路径名的哈希码

        System.out.println(dir.isAbsolute());// 返回此抽象路径名是否是绝对路径名
        System.out.println(file.isDirectory());// 返回此抽象路径是否是一个目录
        System.out.println(file.isFile());// 返回此抽象路径是否是一个文件
        System.out.println(file.isHidden());// 返回此抽象路径是否是一个隐藏文件或者目录

        System.out.println(file.lastModified());// 表示文件最后一次被修改的时间的 long
                                                // 值,用与时间点(1970 年 1 月 1
                                                // 日,00:00:00 GMT)之间的毫秒数表示;

        System.out.println(file.length());// 返回文件长度,以字节为单位;

        System.out.println(dir.list().length);// 返回字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。

        System.out.println(dir.list(new MyFileNameFilter(".xml"))[0]);// 字符串数组,这些字符串指定此抽象路径名表示的目录中给定
        // filter
        // 能接受的文件和目录。

        System.out.println(dir.listFiles().length);// 抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。

        System.out.println(dir.listFiles(new MyFileFilter()).length);// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

        System.out.println(dir.listFiles(new MyFileNameFilter("s")).length);// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

        System.out.println(File.listRoots()[0]);// 列出可用的文件系统根。
        System.out.println(File.listRoots()[1]);

        File txtFile = new File("D:\\射雕英雄传.txt");
        File txtFile2 = new File("D:\\射雕英雄传 - copy.txt");

        System.out.println(txtFile.equals(txtFile2));// 测试此抽象路径名与给定对象是否相等。
        System.out.println(txtFile.compareTo(txtFile2));// 如果该参数等于此抽象路径名,则返回零;如果此抽象路径名在字母顺序上小于该参数,则返回小于零的值;如果此抽象路径名在字母顺序上大于该参数,则返回大于零的值,在
                                                        // UNIX
                                                        // 系统上,比较路径名时,字母大小写通常很重要,而在
                                                        // Microsoft Windows
                                                        // 系统上,这通常不重要。

    }
}

/**
 * 自定义文件过滤器
 * 
 * @author LGB
 *
 */
class MyFileFilter implements FileFilter {

    public MyFileFilter() {
    }

    @Override
    public boolean accept(File pathname) {
        return pathname.isDirectory();
    }
}

/**
 * 自定义文件名过滤器
 * 
 * @author LGB
 *
 */
class MyFileNameFilter implements FilenameFilter {

    private String type;

    public MyFileNameFilter(String type) {
        this.type = type;
    }

    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(type);
    }
}

修改文件名及文件属性

  • renameTo(File dest)

    重新命名此抽象路径名表示的文件。
  • setExecutable(boolean executable)

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

    设置此抽象路径名的所有者或所有用户的执行权限。
  • setLastModified(long time)

    设置此抽象路径名指定的文件或目录的最后一次修改时间。
  • setReadable(boolean readable)

    设置此抽象路径名所有者读权限的一个便捷方法。
  • setReadable(boolean readable, boolean ownerOnly)

    设置此抽象路径名的所有者或所有用户的读权限。
  • setReadOnly()

    标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
  • setWritable(boolean writable)

    设置此抽象路径名所有者写权限的一个便捷方法。
  • setWritable(boolean writable, boolean ownerOnly)

    设置此抽象路径名的所有者或所有用户的写权限。
public class FileTest {

    public static void main(String[] args) {
        File file = new File("D:\\data1.txt");

        file.renameTo(new File("D:\\111\\DATA.TXT"));// 重命名,也可以用作剪切
        file.setExecutable(true);// 设置此抽象路径名所有者执行权限的一个便捷方法。 参数如果为
                                    // true,则设置允许执行操作的访问权限;如果为 false,则不允许执行操作。
        file.setExecutable(true, false);// 设置此抽象路径名的所有者或所有用户的执行权限。 第一个参数如果为
                                        // true,则设置允许执行操作的访问权限;如果为
                                        // false,则不允许执行操作。第二个参数如果为
                                        // true,则执行权限只适用于所有者的执行权限;否则适用于所有用户。如果底层文件系统不能区分所有者执行权限与其他执行权限,那么无论该参数为何值,执行权限将适用于所有用户。
        file.setLastModified(50000000);// 设置最后修改时间
        file.setReadable(false);// 设置此抽象路径名所有者读权限的一个便捷方法。 参数如果为
                                // true,则设置允许读操作的访问权限;如果为 false,则不允许读操作。
        file.setReadable(true, false);// 设置此抽象路径名所有者读权限的一个便捷方法。第一个参数如果为
                                        // true,则设置允许读操作的访问权限;如果为
                                        // false,则不允许读操作。第二个参数如果为
                                        // true,则读权限只适用于所有者的读权限;否则适用于所有用户。如果底层文件系统不能区分所有者读权限与其他读权限,那么无论该参数为何值,读权限将适用于所有用户。
        file.setReadOnly();// 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。调用此方法后,可以保证在被删除或被标记为允许写访问之前,文件或目录不会发生更改。是否可以删除某个只读文件或目录则取决于底层系统。
        file.setWritable(true);// 设置此抽象路径名所有者写权限的一个便捷方法。
        file.setWritable(false, false);//设置此抽象路径名所有者写权限的一个便捷方法。 第一个参数如果为 true,则设置允许写操作的访问权限;如果为 false,则不允许写操作。第二个参数如果为 true,则写权限只适用于所有者的写权限;否则适用于所有用户。如果底层文件系统不能区分所有者写权限与其他写权限,那么无论该参数为何值,写权限将适用于所有用户。 
    }
}

其他方法

  • toString()

    返回此抽象路径名的路径名字符串。
  • toURI()

    构造一个表示此抽象路径名的 file: URI。
  • separator

    与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
public class FileTest {

    public static void main(String[] args) {
        File file = new File("D:\\data1.txt");

        System.out.println(file.toString());// 返回此抽象路径名的路径名字符串。该字符串就是 getPath()
                                            // 方法返回的字符串。
        System.out.println(file.toURI());// 构造一个表示此抽象路径名的 file: URI。 该 URI
                                            // 的具体形式与系统有关。如果可以确定此抽象路径名表示的文件是一个目录,那么所得
                                            // URI 将以斜杠结束。
        
        File f = new File("D:" + File.separator + "data1.txt");
        System.out.println(f);

    }
}