JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解

介绍

在Java中,File类是用于表示文件和目录路径的抽象。它提供了一组方法来创建、删除、重命名、检查文件/目录的存在性、以及查询文件/目录的属性等功能。File类可以用于执行文件系统操作,如创建新文件、删除文件、检查文件是否存在等。

目的是

把字符串先表示为路径

然后转化成File对象

去调用里面的方法

通过父级路径和子级路径拼接的方法

或者是

\ 在Java里是转义字符

字符串和文件拼接

小结

File对象表示路径,可以是文件,也可以是文件夹

这个路径是可以存在的,也可以是不存在的

绝对路径是带盘符的

相对路径是不带盘符的,默认到当前项目下去寻找

常见的成员方法

判断和获取

提前创建了文件

三步走

判断是否存在

判断是否为文件

判断是否为文件夹

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        //对文件进行判断
        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");

        System.out.println(f1.exists());
        //判断f1文件夹是否存在

        System.out.println(f1.isDirectory());
        //如果f1是文件夹方法返回值是true

        System.out.println(f1.isFile());
        //如果f1是文件方法返回值是true

        
        //对文件夹进行判断
        File f2=new File("E:\\新建文件夹\\新建文件夹");
        System.out.println(f2.exists());//true
        System.out.println(f2.isDirectory());//true
        System.out.println(f2.isFile());//false

        
        //如果文件不存在
        File f3=new File("E:\\新建文件夹\\我不存在");
        System.out.println(f3.exists());//false
        System.out.println(f3.isDirectory());//false
        System.out.println(f3.isFile());//false
    }
}

返回文件的大小 单位是字节

不能获取文件夹的大小,返回的结果和硬件有关

如果我们要获取一个文件夹的大小

需要把这个文件夹里的所有文件大小都累加到一起

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("E:\\新建文件夹\\新建文件夹");

        //返回文件的大小(字节数量)
        System.out.println(f1.length());

        //返回文件夹的大小(获取到的是0,因为length方法只能获取文件的大小)
        System.out.println(f2.length());
        
    }
}

获取文件的绝对路径

如果文字前写了模块名

会进行两次查找,即在当前项目下先寻找模块,在寻找文件

不写的话会在当前模块下直接寻找文件

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取文件的绝对路径
        System.out.println(f1.getAbsolutePath());
        System.out.println(f2.getAbsolutePath());
    }
}

获取定义文件对象使用的路径

获取创建File对象时,括号里写的东西

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取定义文件时使用的路径
        System.out.println(f1.getPath());
        System.out.println(f2.getPath());
    }
}

获取文件名称

扩展名,后缀名也会显示

但如果是文件夹,只会返回文件夹的名字,而不会返回后缀名,扩展名

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取名称
        System.out.println(f1.getName());
        System.out.println(f2.getName());
    }
}

返回文件的最后修改时间

获取的是时间的毫秒值

还是要把他变成字符串表示的时间 yyyy年MM月dd日

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取最后一次修改时间的毫秒值
        System.out.println(f1.lastModified());
        System.out.println(f2.lastModified());
    }
}

拓展 把毫秒值转换成表示的时间

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("文字.txt");

        //获取毫秒值
        System.out.println(f1.lastModified());

        long time=f1.lastModified();

        //获得Date对象
        Date date=new Date(time);

        //获取SimpleDateFormat对象
        //可以解析时间变成我们自己喜欢的格式
        //先写解析式
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM--dd HH:mm:ss");

        //把参数传进去,获得字符串
        String t=sdf.format(date);

        System.out.println(t);

    }
}

获取并遍历

最重要的一个方法

获取文件夹里面所有的内容 包括:文件 文件夹 隐藏的文件

把内容放到数组中进行返回 这个数组是file类型的数组

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File f=new File("D:\\新建文件夹");
        File file[]=f.listFiles();
        for (File file : file) {
            //file表示文件夹里的每一文件或者文件夹
            System.out.println(file);
        }
    }
}

当调用者File表示的路径不存在的时候 返回null

当调用者File表示的路径是文件时 返回null

当调用者File表示的路径是一个空文件夹时 返回一个长度为0的数组

当调用者File表示的路径是一个有内容的文件夹时 将里面的所有文件和文件夹的路径放到File数组中进行返回

当调用者File表示的路径是一个有隐藏文件的文件夹时 将里面的所有文件和文件夹的路径房贷File数组中返回 包括隐藏文件

当调用者File表示的路径是需要权限才能访问的文件夹时 返回null

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

public class Main {
    public static void main(String[] args) {
        File f=new File("D:\\新建文件夹");

        //遍历盘符
        File arr1[]=File.listRoots();
        for(File f1:arr1) System.out.println(f1);


        /*-----------------------------------------*/
        //获取当前路径下所有的内容 带拓展名
        String arr2[]=f.list();
        for(String str:arr2) System.out.println(str);


        /*-----------------------------------------*/
        //利用文件名过滤器获取当前路径下所有的内容
        String arr3[]=
        f.list(new FilenameFilter() {
            @Override
            //形参表示文件夹里每一个文件或者文件夹的路径
            public boolean accept(File dir, String name) {
                File src=new File(dir,name);
                //返回值表示当前路径是否保留 保留为true 不保留为false
                return src.isFile()&&name.endsWith(".txt");
            }
        });
        for(String str:arr3) System.out.println(str);

        //转化成Lambda表达式
        f.list((dir, name) -> {
            File src=new File(dir,name);
            return src.isFile()&&name.endsWith(".txt");
        });


        /*-----------------------------------------*/
        File arr4[]=f.listFiles(new FileFilter() {
            @Override
            //形参是完整的每一个文件或者文件夹的路径
            public boolean accept(File pathname) {
                return true;
            }
        });

        //转化成Lambda表达式
        File arr5[]=f.listFiles(pathname -> true);


        /*-----------------------------------------*/
        File arr6[]=f.listFiles(new FilenameFilter() {
            @Override
            //第一个形参表示父级路径 第二个形参表示子级路径
            public boolean accept(File dir, String name) {
                return false;
            }
        });

        //第一个形参表示父级路径 第二个形参表示子级路径
        File arr7[]=f.listFiles((dir, name) -> name.endsWith(".txt"));

    }
}

创建文件夹

要求在当前文件夹下创建一个a.txt文件

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

public class Main {
    public static void main(String[] args) throws IOException {
        File f=new File("D:\\新建文件夹");
        //如果文件已经存在,则创建失败
        f.mkdirs();
        File src = new File(f,"a.txt");
        boolean b=src.createNewFile();
        if(b) System.out.println("创建成功");
        else System.out.println("文件已经存在,创建失败");
    }
}

单个文件夹查找文件

查找某一个文件夹中,是否有txt结尾的文本文档

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        File f=new File("D:\\新建文件夹");
        System.out.println(have(f));
    }
    public static boolean have(File file){
        //进入文件夹,获取里面的所有内容
        File file1[]=file.listFiles();
        //遍历数组获取里面的每一个元素
        for (File f : file1) {
            //f依次表示文件夹里每一个文件或者是文件夹路径
            if(f.isFile()&&f.getName().endsWith(".txt"))
                return true;
        }
        return false;
    }
}

多个文件夹查找文件

找到电脑中所有以avi结尾的电影

搜索所有盘符 要考虑子文件夹

把大问题拆分,拆到某一个文件夹不包含其他文件夹为止

用递归来实现

找到子文件夹了就再扔到递归里面

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        //将盘符获取到数组里
        File arr[]=File.listRoots();
        //通过增强for循环来将数组里的每一个文件对象作为参数传入find函数
        for (File f:arr)find(f);
    }

    public static void find(File file){
        //进入文件夹,获取里面的所有内容
        File file1[]=file.listFiles();
        //判断文件夹是否为空 如果不是空文件夹则进入
        if (file1!=null){
            //遍历文件夹
            for(File f:file1){
                //如果是文件
                if(f.isFile()){
                    //获取文件名并进行判断
                    String name=f.getName();
                    if(name.contains(".txt"))
                        System.out.println(f);
                }
                //如果是文件夹 采用递归的方式
                else {
                    find(f);
                }
            }
        }
    }
}

删除一个多级文件夹

如果我们要删除一个有内容的文件

先删除一个文件夹里的所有内容

再删除自己

其中删除不了无法直接删除的内容(在其他文件中已打开或是没有访问权限等等)

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        delete(file);
    }
    public static void delete(File src){
        //把文件夹内部所有的文件和文件夹放到数组里面去
        File files[]=src.listFiles();
        //遍历每一个文件
        for(File file:files){
            if(file.isFile())//如果是文件,直接删除
                file.delete();
            else delete(file);//如果是文件夹,递归
        }
        src.delete();
    }
}

统计文件夹的大小

统计一个文件夹的总大小

文件夹的总大小说白了就是文件夹里所有文件的大小

import java.io.File;
import java.util.GregorianCalendar;

public class Main {
    //public static long len=0;//定义在外面

    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        System.out.println(getlen(file));
    }
    public static long getlen(File src){
        long len=0;
        //定义变量进行累加
        //得到每一个文件夹
        File files[]=src.listFiles();
        for(File file:files){
            if(file.isFile())
                //如果是文件累加
                len+=file.length();
            else
                //如果是文件夹,递归
                len+=getlen(file);
        }
        return len;
    }
}

统计每种文件的个数

考虑子文件夹

File 递归 Map集合

写一个方法

参数是要统计的那个文件夹

返回值是用来统计map集合的

键:后缀名

值:出现次数

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        HashMap<String,Integer>hm=getCount(file);
        System.out.println(hm);
    }
    public static HashMap<String,Integer> getCount(File src){

        HashMap<String,Integer>hm=new HashMap<>();
        //定义集合来统计

        File[] files=src.listFiles();
        //进入文件夹src

        for(File file:files){
            //如果是文件,进行统计
            if(file.isFile()){
                String name=file.getName();
                String arr[]=name.split("\\.");
                if(arr.length>=2){
                    String endName=arr[arr.length-1];
                    if(hm.containsKey(endName)){
                        //存在
                        int count=hm.get(endName);//把值拿出来
                        count++;//自增
                        hm.put(endName,count);//再放回去
                    }
                    else {
                        //第一次出现
                        hm.put(endName,1);
                    }
                }
            }
            else {
                //如果是文件夹,进行递归 自己调用自己
                HashMap<String,Integer>sonMap=getCount(file);
                //sonMap是子文件夹中每一种文件的个数
                //遍历sonMap把里面的数值都累加到hm当中
                Set<Map.Entry<String,Integer>>entries=sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    //获取键值对对象
                    String key=entry.getKey();
                    int value=entry.getValue();
                    if(hm.containsKey(key)){
                        //存在
                        int count=hm.get(key);//count是从hm获取出来的数值
                        count+=value;//value是从sonMap中获取出来的值
                        hm.put(key,count);//放进去,覆盖
                    }
                    else{
                        //不存在
                        hm.put(key,value);
                    }
                }
            }
        }
        return hm;
    }
}

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

 

  • 42
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值