File类的相关方法

java.io.File类


  • 文件和路径名的抽象表达形式

  • java把电脑中的文件和文件夹(目录)封装了一个File类,我们可以使用File类对文件和文件夹进行如下操作

    1. 创建一个文件/文件夹
    2. 删除
    3. 获取
    4. 判断文件/文件夹是否存在
    5. 文件夹遍历
    6. 获取文件大小
      注:File类是一个与系统无关的类,任何的操作系统都可以使用这个类的方法
  • 重点单词

file:文件 directory:文件夹/目录 path:路径

File类的静态成员方法 -File调用

  1. static String pathSeparator
    与系统有关的路径分隔符,打印是一个分号。 Linux(😃

String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator); //;

  1. static char pathSeparatorChar
    与系统有关的路径分隔符。

  2. static String separator
    与系统有关的默认名称分隔,打印是windows反斜杠。Linux(/)

String separator = File.separator;
System.out.println(separator); // \

  1. static char separatorChar
    与系统有关的默认名称分隔符。
    • 注:操作路径不能写死,因为程序可能不是在Windows下

eg: D:\vs2019\TS改为
"D:"+File.separator+"vs2019"+File.separator+TS"

File类构造方法


  1. File(File parent, String child)
    根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
    • File parent优点:路径是File类型,可以对路径进行操作,再创建对象

    public static void show02(){
        File parent = new File("D:\\");
        File file = new File(parent.getParent(), "b.txt");

  1. File(String pathname)
    通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
    • String name:字符串的路径名称

      1.路径可以是文件结尾/也可以文件夹结尾
      2.可以是相对/绝对路径
      3.路径可以是存在的,可以是不存在的
      注:创建File对象,只是把字符串路径封装为File对象,不考虑路径真假

    public static void show01(){
        File file = new File("D:\\vs2019\\TS\\a.txt");
        //重写了toString方法
        System.out.println(file);  //D:\vs2019\TS\a.txt  
    }
  1. File(String parent, String child)
    根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    • 把路径分为两部分,使用灵活

      String parent:eg: "c:\\"-灵活修改
      String child:eg: "a.txt" -灵活修改

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

常用方法 - File对象调用


创建/删除文件或文件夹


  1. public boolean createNewFile()

    由File对象调用创建,创建的是生成对象时,构造方法里的路径文件,可以是相对路径
    创建成功:true
    创建失败:false

    只能创建文件,不可创建文件夹,若书写有误,默认txt类型
    文件的路径必须存在,否则抛出异常

//由于方法声明抛出异常,在写程序时,就会把异常扔回调用者,我们必须处理
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);
    }
    private static void show01() {
        //报错
        //File file = new File("D:\\vs2019\\TS");
        //file.createNewFile();

        //创建成功,注意用于有无权限访问文件夹
        File file = new File("D:\\a.txt");
        try {
            System.out.println(file.createNewFile());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
  1. public boolean mkdir()

    创建单级文件夹,由File生成对象时,构造方法的参数创建

    private static void show01() {
        File file = new File("文件夹1\\子文件夹");
        System.out.println(file.mkdir());//false

        //File file = new File("文件夹1");
        // System.out.println(file.mkdir()); true
    }
}
  1. public boolean mkdirs()

    创建多级文件夹,也可以时单级的,绝对/相对都可以

    private static void show01() {
        File file = new File("文件夹1\\子文件夹");
        System.out.println(file.mkdirs());  //true
    }
    //如果书写错误,还是创建的文件
}

  1. public boolean delete()

    删除构造方法给出的文件/文件夹
    false:文件夹里有内容,构造方法的参数路径不存在
    注:直接在硬盘删除,不走回收站

获取功能的方法


  1. public String getAbsolutePath()

    获取构造方法中的绝对路径

    private static void show01() {
        File file = new File("D:\\vs2019\\TS");
        String file1 = file.getAbsolutePath();
        System.out.println(file);  //D:\vs2019\TS

        File file0 = new File("a.txt");
        String file02 = file0.getAbsolutePath();
        //当前写程序的相对文件下的,绝对路径
        System.out.println(file02);   //C:\Users\Administrator\Desktop\java_code\a.txt
        //实际也可以写(file2.toString()),底部调用的是getPath()

    }
  1. public String getPath()

    与上面不同,获取构造方法的路径,是什么就是什么

  2. public String getName()

    获取构造方法中的结尾文件/或者文件夹

  3. public long length()

    获取的是构造方法指定的文件大小,以字节为单位Byte
    注:返回0 的情况 - 文件是没有大小单位的,路径不存在

判断功能方法


  1. public boolean exists()

    File对象调用,文件/目录存在返回True。否则false
    也可以判断相对路径下的文件

  2. public boolean isDirectory()

    判断构造方法中给的路径是否以文件结尾

  3. public boolean isFile

    判断构造方法中给的路径是否以文件结尾
    注:前提需要路径存在

File类遍历文件/文件夹的功能


  1. public String[] list()

    用于遍历构造方法中的路径,返回的时一个包含目录中所有子目录与文件的字符串数组,但仅限当前目录下,不会向下递归

    private static void show01() {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java_code");
        String[] list = file.list();
        for(String str : list) {
            System.out.println(str);
        }
    }
    /*
.idea
.vscode
demo01
demo02
demo03
    */

递归遍历子目录/子文件

package DiGui;

import java.io.File;

public class DiGui {
    public static void main(String[] args) {
        File dir = new File("C:\\Users\\Administrator\\Desktop\\java_code");
        showFile(dir);
    }

    public static void showFile(File dir) {
        //得到dir的子 文件/目录
        File[] list = dir.listFiles();
        System.out.println(dir.getAbsolutePath());

        //   遍历该 目录/文件
        for (File path : list) {
            //如果是目录递归打印
            if (path.isDirectory()) {
                showFile(path);
            } else {
                System.out.println(path.getAbsolutePath());
            }
        }
    }

}



递归遍历指定文件,完成指定文件搜索

public static void showFile(File dir) {
    //得到dir的子 文件/目录
    File[] list = dir.listFiles();
    //   遍历该 目录/文件
    for (File path : list) {
        //如果是目录递归打印
        if (path.isDirectory()) {
            showFile(path);
        } else {
            /*
            将path转化为字符串
                1.path.getName();
                2.path.getPath(); == path.toString();
            */
            //调用字符串的方法,优化判断后缀名,判断结尾后缀名
            if (path.getName().toLowerCase().endsWith(".md")) {
                System.out.println(path.getAbsolutePath() + "\n找到了");
            }
        }
    }
}
  1. public File[] listFiles()

    同上,不过返回的是File数组,将文件/文件夹路径封装为File对象

    private static void show01() {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java_code");
        File[] list = file.listFiles();
        for(File str : list) {
            System.out.println(str);
        }
    }

    /*
C:\Users\Administrator\Desktop\java_code\.idea
C:\Users\Administrator\Desktop\java_code\.vscode
C:\Users\Administrator\Desktop\java_code\demo01
C:\Users\Administrator\Desktop\java_code\demo02
C:\Users\Administrator\Desktop\java_code\demo03
    */
  • 注:list()与listFiles方法遍历的是构造方法的参数目录,若不存在,抛出空指针异常,如果构造方法中给的不是目录也会抛出空指针异常

过滤器


  • 在File类中有两个ListFiles的两个重载方法,方法的传递参数就是过滤器

    1. File[] listFiles(FileFilter filter)
      返回抽象路径名数组,java.io.FileFilter接口,用于抽象路径名(File的对象)的过滤器(Filter)

      作用:用来过滤文件(File对象)
      抽象方法: boolean accept(File pathname)
      测试指定抽象路径名是否应该包含在某个路径名列表中。
      File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象

public static void showFile(File dir) {
        //匿名内部类重写过滤器抽象方法,多态,使用过滤器来过滤不想要的
        File[] list = dir.listFiles(new FileFilter() {

            /*

            过滤机制:上述listFiles做了如下几件事
            1. listFiles会获取dir目录中的每一个文件/文件夹——>封装为File对象
            2. listFiles方法会调用参数传递过滤器中的方法accept
            3. listFiles方法会把遍历的每一个对象给accept方法的pathName,因此可以用以下方法进行过滤
            4. 但由于返回值是布尔值,若是True,就会把传递进来的对象保存回File数组中,若是false,不保存
             */
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().toLowerCase().endsWith(".md")){
                    return true;
                }
                else {
                    //如果是文件夹递归,否则不存
                    if (pathname.isDirectory()){
                    showFile(pathname);
                    return false;
                    }else
                    return false;
                }
            }
        });


        //打印文件.md路径
        for (File fileName: list) {
            System.out.println(fileName.getAbsolutePath());
        }
    }

}
    //另一种写法,但是File[]存在有所有文件/目录,当然也可以用lambda
    public static void showFile(File dir) {
        //匿名内部类重写过滤器抽象方法,使用过滤器来过滤不想要的
        File[] list = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //返回后缀为.md的文件,endWith返回的是布尔值,若是文件也放进去,用于下面方法的递归
                return pathname.getName().endsWith(".md") || pathname.isDirectory();
            }
        });

        //打印文件.md路径
        for (File fileName : list) {
            if (fileName.isDirectory()){
                showFile(fileName);
            }else
            System.out.println(fileName.getAbsolutePath());

        }
    }
2.  File[] listFiles(FileNameFilter filter) 
      返回抽象路径名数组,java.io.FileNameFilter接口,实现该接口的实例可用于过滤文件名, 【比1方便】
      >作用:用于过滤文件名称
      >抽象方法: boolean accept(File dir, String name) 
      >dir:构造方法中被遍历的目录
      >name :使用ListFiles的方法遍历得到的,文件/文件夹名称   
package DiGui;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

public class DiGui {
    public static void main(String[] args) {
        File dir = new File("C:\\Users\\Administrator\\Desktop\\java_code");
        showFile(dir);
    }

    public static void showFile(File dir) {
/*        //lambda表达式
        File[] list = dir.listFiles((File pathname,String pathStr)-> {

                //返回后缀为.md的文件,endWith返回的是布尔值,若是文件也放进去,用于下面方法的递归
                return pathStr.toLowerCase().endsWith(".md") || new File(pathname,pathStr).isDirectory();

        });*/

        File[] list = dir.listFiles((pathname,pathStr)-> pathStr.toLowerCase().endsWith(".md") || new File(pathname,pathStr).isDirectory());
        
        //打印文件.md路径
        for (File fileName : list) {
            if (fileName.isDirectory()){
                showFile(fileName);
            }else
            System.out.println(fileName.getAbsolutePath());

        }
    }

}


posted @ 2019-09-19 21:42  学之初  阅读(465)  评论(0编辑  收藏  举报