【Java】文件操作

1 File类的静态成员遍历

字段摘要
static String pathSeparator与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar与系统有关的路径分隔符。
static String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
static char separatorChar与系统有关的默认名称分隔符。

路径分割符:Windows:分号 Linux:冒号
文件名称分割符:Windows:\反斜杠 Linux:/正斜杠
注意:操作路径不能写死,应该使用File.separator来连接

2 绝对路径和相对路径

绝对路径:以盘符开始的完整路径
相对路径:相对于当前项目的根目录
C:\files\file.txt —> file.txt
路径不区分大小写
反斜杠是转义符 两个反斜杠表示一个反斜杠

3 File类的构造方法

public static void constructMethod() {
        File file = new File("C://test.txt");
        System.out.println(file);//重写了Object类的toString方法 打印文件路径 路径可以不真实存在

        File file2 = new File("C:","a.txt");//父子路径单独书写 变化灵活
        System.out.println(file2);

        File file3 = new File("c:\\");//第一个参数的类型是File类而不是String
        File file4 = new File(file3,"a.txt");
        System.out.println(file4);
    }

4 常用方法

获取

  1. getAbsolutePath
  2. getPath
  3. getName
  4. length:文件长度
public static void method() {
        File f1 = new File("a.txt");//相对路径
        String absolutePath = f1.getAbsolutePath();
        System.out.println(absolutePath);//打印绝对路径

        String path = f1.getPath();
        System.out.println(path);//打印路径参数 a.txt
        System.out.println(f1.toString());//toString源码调用的就是getPath()

        File f2 = new File("E:\\download\\learn\\a.txt");
        File f3 = new File("a.txt");
        File f4 = new File("E:\\download\\learn");
        //getName打印结尾部分 文件名/文件夹名
        System.out.println(f2.getName());//a.txt
        System.out.println(f3.getName());//a.txt 文件名
        System.out.println(f4.getName());//learn 文件夹名

        //length返回的是文件长度 
        //获取构造方法指定的文件的大小 单位为byte
        //文件不存在返回0 文件夹没有大小概念 也是0
        System.out.println(f2.length());
    }

判断

  1. exists():路径是否存在
  2. isDirectory():file对象是否是文件夹,路径不存在返回false
  3. isFile():file对象是否是文件,路径不存在返回false
public static void method() {
        File f1 = new File("a.txt");//相对路径
        System.out.println(f1.exists());

        File f2 = new File("E:\\download\\learn");
        System.out.print(f1.isFile());
        System.out.println(" " + f1.isDirectory());//true false
        System.out.print(f2.isDirectory());
        System.out.println(" " + f2.isFile());//true false
    }

创建和删除

  1. createNewFile():当该名称的文件不存在的时候,创建一个空文件,返回true。若文件存在,不创建返回false。此方法只能创建文件,不能创建文件夹。路径必须存在,否则会抛出异常。【调用该方法会抛出IO异常 要么throws 要么try-catch】
  2. delete():删除file表示的文件或目录,谨慎使用,直接在硬盘删除文件/文件夹,不走回收站。注意:如果文件夹中有东西,则不会删除成功,返回false。如果路径不存在,返回false。
public static void method() throws IOException {
        File f1 = new File("a.txt");//相对路径 存在
        boolean b1 = f1.createNewFile();
        System.out.println(b1);// false


        File f2 = new File("b.txt");//不存在 创建返回true
        boolean b2 = f2.createNewFile();
        System.out.println(b2);// true

        File f3 = new File("F://none");//路径不存在
        System.out.println(f3.createNewFile());//报错:系统找不到指定的路径

    }
  1. mkdir():创建file表示的目录
  2. mkdirs():创建file表示的目录 包括必须但不存在的父级目录
public static void method() throws IOException {
        File f1 = new File("E:\\download\\newlearn");//新文件夹
        boolean mkdir1 = f1.mkdir();
        System.out.println(mkdir1);//true
        File f2 = new File("E:\\download\\learn");//已存在文件夹
        boolean mkdir2 = f2.mkdir();
        System.out.println(mkdir2);//false

        File f3 = new File("E:\\download\\newlearn\\learn\\learn");
        System.out.println(f3.mkdir());// false不能创建多级目录
        System.out.println(f3.mkdirs());// true 可以创建多级目录

        File f4 = new File("F:\\download");//路径不存在
        System.out.println(f4.mkdir());// false
    }

遍历目录

  1. String[] list()
  2. File[] listFile()

注意
如果路径不存在,会报空指针异常。
如果路径不是目录,也会报空指针异常。
可以遍历到隐藏文件夹。

public static void method() throws IOException {
        File f1 = new File("E:\\download\\learn\\");
        
        String[] list = f1.list();
        for(String i: list){
        //相对路径
            System.out.println(i);
        }
		
        File[] list = f1.listFiles();
        for(File i: list){
        //绝对路径
            System.out.println(i);
        }
    }

5 案例:递归打印多级目录

public static void main(String[] args) {
        File dir = new File("E:\\download\\1");
        getAllFiles(dir);
    }
    public static void getAllFiles(File dir){
        File[] files = dir.listFiles();
        for(File file: files){
            System.out.println(file);
        }
    }

打印结果:显示不全 没有子文件夹 2里面还有3和4

E:\download\1\2
E:\download\1\2.doc
E:\download\1\2.txt

解决方法:如果遇到文件夹,则递归调用getAllFiles()

public static void main(String[] args) {
        File dir = new File("E:\\download\\1");
        getAllFiles(dir);
    }
    public static void getAllFiles(File dir){
        File[] files = dir.listFiles();
        for(File file: files){
            if(file.isDirectory()){
                getAllFiles(file);
            }
            System.out.println(file);
        }
    }

E:\download\1\2\3\4.txt
E:\download\1\2\3
E:\download\1\2\3.pptx
E:\download\1\2\3.txt
E:\download\1\2
E:\download\1\2.docx
E:\download\1\2.txt

6 案例:文件搜索

只要txt文件,其他的不需要。

public class FileTest {
    public static void main(String[] args) {
        File dir = new File("E:\\download\\1");
        getAllFiles(dir);
    }
    public static void getAllFiles(File dir){
        File[] files = dir.listFiles();
        for(File file: files){
            if(file.isDirectory()){
                getAllFiles(file);
            }else {
                if(file.toString().endsWith(".txt")){
                    System.out.println(file);
                }
            }
        }
    }
}

7 文件过滤器

File类中有两个listFiles的重载方法,参数类型是过滤器

java.io.fileFilter接口 用于抽象路径名的过滤器,抽象方法accept(File pathname)

java.io.fileNameFilter接口 用于过滤文件名称,抽象方法accept(File dir, String name)
文件对象用这个构造方法 —> File(dir, name)

需要自己写实现类,重写抽象方法,自定义过滤规则

listFiles对目录进行遍历,获取文件和文件夹并封装为File对象
然后调用accept方法 讲File对象传递到accept的参数
如果返回值是false就会保存到数组中

public static void getAllFiles(File dir){
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()){
                    return true;
                }
                return pathname.toString().endsWith("txt");
            }
        });
        for(File file: files){
            if(file.isDirectory()){
                getAllFiles(file);
            }else {
                System.out.println(file);
            }
        }
    }

输出:

E:\download\1\2\3\4.txt
E:\download\1\2\3.txt
E:\download\1\2.txt

Lambda简化

File[] files=dir.listFiles(
                (pathname)-> pathname.isDirectory()||pathname.getName().endsWith(".txt")
        );
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值