java-常见类之File类

1. File类

1.1 概述

​ java.io包中提供了一个File类,该类用于表示系统中文件或者目录,使用File类可以对文件或者目录结构进行操作,即使用java.io.File类提供的构造方法和普通方法可以对文件(标准文件,目录)进行:创建,删除,扫描,等操作

1.2. 构造方法

  • File(String path)
  • File(String parent,String child)
  • File(File parent,String child)
//使用提供的文件(或目录)路径
File f = new File("D:/素材/视频/短视频/大事发生.mp4");
System.out.println(f.toString());
f = new File("D:/素材/视频/短视频","大事发生.mp4");
System.out.println(f);
f = new File(new File("D:/素材/视频/短视频"),"大事发生.mp4");
System.out.println(f);

1.3. 常见方法

  • createNewFile():创建由当前File对象所表示的新文件(标准文件)
  • mkdir():创建由当前File对象所表示的目录(一级子目录)
  • mkdirs():创建由当前File对象所表示的目录(多级子目录)
  • delete():删除当前File所表示的文件或者目录(空目录)
  • exists():判断当前File表示的文件或目录是否存在
  • getAbsolutePath():获取当前File对象的绝对路径
  • getName():获取当前文件名
  • getParentFile():获取当前RFile所表示的父文件对象
  • isDirectory():判断当前File对象所表示的是否是一个目录
  • isFile():判断当前File对象所表示的是否是一个标准文件
  • length():获取File对象表示的文件大小(字节),若目录返回0
  • lastModified():获取File对象表示文件的最后修改时间(毫秒:从1970.01.01 00:00:00到最后修改时间)
  • list():返回当前File对象所表示目录中的所有子文件或子目录名称数组(String数组)
  • listFiles():返回当前File对象所表示目录中的所有子文件或子目录对象(File数组)
  • listFiles(FileFilter filter):使用指定的过滤规则,返回当前File对象所表示目录中的所有子文件或子目录对象(File数组)
  • listRoots():返回当前系统的所有盘符数组
  • renameTo(File file):重命名文件
//获取与系统有关的路径分隔符 window-";"  linux-":"
System.out.println(File.pathSeparatorChar);
//获取与系统有关的名称分隔符 window-"\"  linux="/"
System.out.println(File.separatorChar);

//使用提供的文件(或目录)路径
File f = new File("D:/素材/视频/短视频/大事发生.mp4");
System.out.println(f.toString());
f = new File("D:/素材/视频/短视频","大事发生.mp4");
System.out.println(f);
f = new File(new File("D:/素材/视频/短视频"),"大事发生.mp4");
System.out.println(f);


System.out.println(f.canExecute());
System.out.println(f.canRead());
System.out.println(f.canWrite());
f = new File("D:/素材/视频/短视频/小电影/mp4/xx/私密");
//创建当前File对象所表示的新文件
//        System.out.println("文件创建结果:"+f.createNewFile());

//创建目录,创建一级子目录
//        System.out.println("目录创建结果:"+f.mkdir());
//创建目录,创建多级子目录(包括不存在的父目录)
System.out.println("目录创建结果:"+f.mkdirs());
//在指定的目录中创建指定前缀和后缀的临时文件
File tempFile = File.createTempFile("test",".log",new File("D:/素材/视频/短视频"));
//        new Timer().schedule(new TimerTask() {
//            @Override
//            public void run() {
//                if(tempFile.delete()){
//                    System.out.println("删除成功");
//                }else{
//                    System.out.println("删除失败");
//                }
//            }
//        },5000);
//        System.out.println(f);
//在JVM结束时删除文件
tempFile.deleteOnExit();

f = new File("D:\\素材\\视频\\短视频\\小电影\\mp4\\xx\\私密");
//删除由File所表示的标准文件或者目录(空目录)
System.out.println("删除目录:"+f.delete());
//判断由File所表示的标准文件或者目录是否存在
System.out.println(f.getParentFile().exists());

//获取由该File对象所表示的文件或目录的绝对路径
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("绝对路径表示的文件对象"+f.getAbsoluteFile());

//获取当前文件或目录所表示磁盘的剩余空间(字节)
//1024字节=1KB 1024kb=1MB  1024MB=1GB 1024GB=1TB 1024TB=1PB
System.out.println("当前盘符剩余空间:"+f.getParentFile().getFreeSpace()+"字节");
System.out.println((f.getParentFile().getFreeSpace() / (1024 * 1024 * 1024)));
System.out.println("当前盘符的总空间:"+f.getParentFile().getTotalSpace()+"字节");

f = new File("D:/素材/视频/短视频/大事发生.mp4");
//获取文件名称
System.out.println("文件名:"+f.getName());

System.out.println("父路径:"+f.getParent());

System.out.println("父路径所表示的文件:"+f.getParentFile());

System.out.println("判断File对象是否是目录:"+f.isDirectory());
System.out.println("判断File对象是否是标准文件:"+f.isFile());

f = new File("D:\\素材\\视频\\预告片\\猫和老鼠.mp4");
System.out.println(f.exists());
System.out.println("判断当前文件对象是否是隐藏文件:"+f.isHidden());
//获取当前文件的最后修改时间
long time = f.lastModified();
System.out.println(new Date(time));

//获取目标File对象所表示文件的大小(字节)
long len = f.length();
System.out.println(len / (1024*1024.0));

1.4. 文件过滤

在一些项目的需求中,可能会涉及到对文件的筛选,常规的做法如下:

File file = new File("D:\\素材\\音乐\\music素材");
File[] files = file.listFiles();
for (File f : files) {
    if (f.getName().endsWith(".mp3")) {
    	System.out.println(f.length() + "------" + f.getName());
    }
}

以上方式采用普通的条件判断对文件进行筛选;对于File类,JDK还提供了一个用于文件过滤的方法:listFile(FileFilter filter),其中FileFilter是JDK1.2新增的一个用于实现过滤规则的接口,源码如下:

public interface FileFilter {
    boolean accept(File pathname);
}

listFile(FileFilter filter)方法中实现源代码如下:

public File[] listFiles(FileFilter filter) {
    //获取当前File对象下所有的子文件和子目录名称
    String ss[] = list();
    if (ss == null) return null;
    //创建新集合用于存储过滤之后的文件
    ArrayList<File> files = new ArrayList<>();
    //对所有的子文件和子目录名遍历
    for (String s : ss) {
        //根据提供的文件名和当前目录对象构建新的File(需要被筛选的File)
        File f = new File(s, this);
        //判断是否有提供过滤器,若未提供则不执行过滤,即:将文件直接放行
        //然后调用被调用方实现的FileFilter中的accept方法执行过滤
        if ((filter == null) || filter.accept(f))
            //将符合条件的文件对象加入集合中
            files.add(f);
    }
    //将集合对象转换为File数组返回
    return files.toArray(new File[files.size()]);
}

在客户端中使用listFile(FileFilter filter)执行过滤:

File file = new File("D:\\素材\\音乐\\music素材");
File[] list = file.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.getName().endsWith(".jpg");
    }
});

for (File f : list) {
    System.out.println(f.getName());
}

文件过滤器实现原理:

在这里插入图片描述

1.5. 递归读取文件夹

public class FileDemo5 {

    public void readDir(File dir){
        //读取目录下的所有子文件对象
        File[] files = dir.listFiles();
        if(Objects.nonNull(files)){
            for(File f:files){
                System.out.println(f.getAbsolutePath());
                if(f.isDirectory()){
                    //递归读取
                    readDir(f);
                }
            }
        }
    }

    public static void main(String[] args) {
        File file = new File("D:\\素材\\视频");
        new FileDemo5().readDir(file);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值