Java File类

一 File 类

File 是文件或者目录的抽象表示形式 .也就是说它既可以表示一个标准文件(比如 : *.txt等)也可以表示一个目录(一组文件的集合).

说明 : 由于本文只是学习File类的相关API,因此直接使用代码来测试API,代码中有相应注释. 因此在代码之外不会有过多的文字描述.

1.1 File 类的静态成员.

注意 : 名称 != 路径

// 与系统有关的默认 名称 分割符.
System.out.println("名称分割符 : " + File.separator);
System.out.println("名称分割符 : " + File.separatorChar);
// 与系统有关的 路径 分隔符
System.out.println("路径分割符 : " + File.pathSeparator);
System.out.println("路径分割符 : " + File.pathSeparatorChar);
// 输出
// 名称分割符 : \
// 名称分割符 : \
// 路径分割符 : ;
// 路径分割符 : ;

1.2 创建 File 和 文件.

/**
 * 创建和修改.
 */
public static void testFile_04() {
    // 创建 File ,如果文件路径不存在则同样可以创建一个File实例.
    // 因此不要使用 file==null 判断文件是否存在.应该使用  file.exists();
    File file1 = new File("D:/TestForlder/123.txt");
    System.out.println("存在 : " + file1.exists());
    // 当文件不存在时创建文件
    try {
        System.out.println(file1.createNewFile());
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 创建临时文件
    try {
        // 注意文件名称不是 "456.java" ,而是 "456" + "系统生成的字符串" + ".java"
        // 临时文件 : D:\TestForlder\4563410495359450983005.java
        File file2 = File.createTempFile("456", ".java",new File("D:/TestForlder"));
        System.out.println("临时文件 : " + file2.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 删除文件
    System.out.println(file1.delete());
    // 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
    new File("D:/TestForlder/1.java").deleteOnExit();
    
    // 创建路径 , 父目录必须存在.不会自动创建父目录. 
    System.out.println("创建路径 : " + new File("D:/TestForlder/111").mkdir());
    // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
    System.out.println("递归创建目录 : " + new File("D:/TestForlder/222/333").mkdirs());
    // 重命名文件.
    System.out.println(new File("D:/TestForlder/2.java")
            .renameTo(new File("D:/TestForlder/重命名.java")));
}

1.3 设置文件属性.

/**
 * 设置文件属性.
 */
public static void testFile_05() {
    File file = new File("D:/TestForlder/3.java");
    // 设置 所有者执行权限
    file.setExecutable(true);
    // 设置所有者或所有用户执行权限
    file.setExecutable(true, false);
    // 设置最后修改时间
    file.setLastModified(123);
    // 设置所有者读权限
    file.setReadable(true);
    // 设置所有者或所有用户的读
    file.setReadable(true, false);
    // 设置只读
    file.setReadOnly();
    // 设置所有者写权限
    file.setWritable(true);
    // 设置所有者或者所有用户的写权限
    file.setWritable(true, false);
}

1.4 基本信息API

/**
 * File 获取信息.
 */
public static void testFile_03() {
    // getName() :  返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。
    // getPath() :  将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。
    // getParent() : 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
    // 局对路径
    File file = new File("D:/TestForlder");
    System.out.println("绝对路径 : " + file.getPath());
    // 相对路径
    File file2 = new File(".");
    System.out.println("相对路径 : " + file2.getPath());
    // 获取绝对路径 File JDK 文档上说是相当于 : new File(file2.getAbsolutePath());
    File fileAb = file2.getAbsoluteFile();
    File fileAb2 = new File(file.getAbsolutePath());
    System.out.println("绝对路径文件 : " + fileAb.getPath());
    // File 对象的局对路径.
    System.out.println("绝对路径 : " + file.getAbsolutePath());
    // 指定路径所在分区的剩余空间.
    System.out.println("可用空间 : " + file.getFreeSpace() / (1024 * 1024 * 1024) + " G");
    // 获取父目录名称
    System.out.println("父目录名称 : " + file.getParent());
    // 此路径上的总空间 
    System.out.println("总空间 : " + file.getTotalSpace() / (1024 * 1024 * 1024) + " G");
    // 抽象路径名指定的分区上可用于此虚拟机的字节数。
    System.out.println("JVM 可用空间 : " + file.getUsableSpace() / (1024 * 1024 * 1024) + " G");
    // 最后修改时间
    System.out.println("最后修改时间 : " + file.lastModified());
    // 文件长度
    System.out.println("文件长度 : " + file.length());
    System.out.println("执行 : " + file.canExecute());
    System.out.println("可读 : " + file.canRead());
    System.out.println("可写 : " + file.canWrite());
    System.out.println("存在 : " + file.exists());
    System.out.println("绝对路径 : " + file.isAbsolute());
    System.out.println("目录 : " + file.isDirectory());
    System.out.println("标准文件 : " + file.isFile());
    System.out.println("隐藏文件 : " + file.isHidden());
}

1.6 基本目录操作

/**
 * 目录下文件.
 */
public static void testFile_01() {
    // 文件路径.
    String filePath = "D:/TestForlder";
    // 创建目录File对象.
    File file = new File(filePath);
    // 获取目录下的所有文件. 使用正则表达式查找所有的 ".java" 文件.
    String[] list = file.list(new MainEntry.DirFilter("\\w+.java"));
    // 排序
    Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
    // 打印
    for (String string : list) {
        System.out.println("文件 : D:/TestFordler/" + string);
    }
}

/**
 * @author WSJ
 * 文件名称过滤器,<br>
 * 该类实现了 `FilenameFilter`接口.该接口只有一个`accept()`方法
 * 该目录下的每一个文件口会执行该方法,来确定是否符合条件.
 */
public static class DirFilter implements FilenameFilter {
    // 正则表达式
    private Pattern mPattern;
    public DirFilter(String regex) {
        mPattern = Pattern.compile(regex);
    }
    @Override
    public boolean accept(File dir, String name) {
        // 使用正则表达式过滤文件, 每一个文件都会在这个方法中进行判断是否符合条件.
        return mPattern.matcher(name).matches();
    }
}

推荐阅读更多精彩内容