File


File

思考:我们可以对硬盘进行哪些操作?

读、写

IO就可以对硬盘中的文件进行读写

​ 1.可以将数据从本地文件中读出来

​ 2.可以将数据从内存保存到本地文件

File表示要读写的文件在哪儿,也可以对文件进行创建、删除等操作

​ 1.在读写数据时告诉虚拟机要操作的(文件/文件夹)在哪儿

​ 2.对(文件/文件夹)本身进行操作,包括创建、删除等等

File类

File类介绍

  • 它是文件和目录路径名的抽象表示

  • 文件和目录是可以通过File封装成对象的

  • 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的

  • File类的构造方法

    方法名 说明
    File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
    File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例
    File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例
  • 示例代码

package com.cloudcore.filetest;

import java.io.File;

/**
 * @Author: hepeng
 * @Date: 2021/10/11 22:26
 */
public class FileDemo1 {
    public static void main(String[] args) {
        method1();
        method2();
        method3();
    }

    private static void method3() {
        //File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的 File实例
        File file1 = new File("F:\\itheima");
        String document = "a.txt";
        File file = new File(file1,document);
        System.out.println(file);
    }

    private static void method2() {
        //File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的 File实例
        String path = "F:\\itheima";
        String document = "a.txt";
        File file = new File(path,document);
        System.out.println(file);
        //F:\itheima\a.txt
    }

    private static void method1() {
        //File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
        String path = "F:\\itheima\\a.txt";
        File file = new File(path);
        //问题:为什么要把字符串形式表示的路径变成File对象?
        //就是为了使用File类里面的方法
        System.out.println(file);
        //F:\itheima\a.txt
    }
}

绝对路径和相对路径

  • 绝对路径

    是一个完整的路径,从盘符开始

    File file = new File("F:\\itheima\\a.txt");
    
  • 相对路径

    是一个简化的路径,相对当前项目下的路径

    File file1 = new File("a.txt");
    File file2 = new File("模块名\\a.txt");
    

File类创建功能【应用】

创建方法

  • 方法分类

    方法名 说明
    public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
    public boolean mkdir() 创建由此抽象路径名命名的目录
    public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
  • 示例代码

package com.cloudcore.filetest;

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

/**
 * @Author: hepeng
 * @Date: 2021/10/11 22:47
 */
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        //public boolean createNewFile()  创建一个新的空的文件
        method1();
        //public boolean mkdir()  创建一个单级文件夹
        method2();
        //public boolean mkdirs()  创建多级文件夹
        method3();

    }

    private static void method3() {
        //public boolean mkdirs()  创建多级文件夹
        File file = new File("F:\\itheima\\ccc\\ddd\\hhh");
        boolean mkdirs = file.mkdirs();
        System.out.println(mkdirs);
        //注意点:
        //1.可以创建单级文件夹也可以创建多级文件夹
        //2.不管调用者有没有后缀,只能创建文件夹
    }

    private static void method2() {
        //public boolean mkdir()  创建一个单级文件夹
        File file = new File("F:\\itheima\\aaa");
        boolean result = file.mkdir();
        System.out.println(result);
        //注意点:
        //1.只能创建单级文件夹,不能创建多级文件夹
        //2.不管调用者有没有后缀,只能创建文件夹
    }

    private static void method1() throws IOException {
        //public boolean createNewFile()  创建一个新的空的文件
        File file = new File("F:\\itheima\\a.txt");
        boolean result = file.createNewFile();
        System.out.println(result);
        //注意点:
        //1.如果文件存在,创建失败返回false
        //2.如果文件不存在,创建成功,返回true
        //3.createNewFile不管调用者有没有后缀只能创建文件
    }
}

疑问

既然mkdirs既可以创建单级文件夹也可以创建多级文件夹,那么还要mkdir有何用?

是的,以后直接使用mkdirs

删除方法

  • 方法分类

    方法名 说明
    public boolean delete() 删除由此抽象路径名表示的文件或目录
  • 示例代码

package com.cloudcore.filetest;

import java.io.File;

/**
 * @Author: hepeng
 * @Date: 2021/10/11 23:01
 */
public class FileDemo4 {
    public static void main(String[] args) {
        //public boolean   delete()
        method1();
        //注意点:
        //1.用delete删除是不走回收站的
        //2.可以删除文件或者文件夹
        //3.如果删除的是文件,那么直接删除
        //  如果删除的是文件夹,只能删除空文件夹
        //4.如果想要删除一个有内容的文件夹,只能先进入到这个文件夹,把里面内容全部删除完毕,才能再次删除这个文件夹
        File file = new File("F:\\itheima\\aaa");
        boolean result = file.delete();
        System.out.println(result);
    }

    private static void method1() {
        //public boolean   delete()
        File file = new File("F:\\itheima\\a.txt");
        boolean result = file.delete();
        System.out.println(result);
    }
}
File类判断和获取功能
  • 判断功能

    方法名 说明
    public boolean isDirectory() 测试此抽象路径名表示的File是否为目录
    public boolean isFile() 测试此抽象路径名表示的File是否为文件
    public boolean exists() 测试此抽象路径名表示的File是否存在
  • 获取功能

    方法名 说明
    public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
    public String getPath() 将此抽象路径名转换为路径名字符串
    public String getName() 返回由此抽象路径名表示的文件或目录的名称
    public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
  • 示例代码

package com.cloudcore.filetest;

import java.io.File;

/**
 * @Author: hepeng
 * @Date: 2021/10/12 20:34
 */
public class FileDemo5 {
    public static void main(String[] args) {
        //public   boolean isDirectory()  判断是否为目录
        //public   boolean isFile() 判断是否为文件
        method1();
        //public   boolean   exists()  判断file是否存在
        method2();
        //public   String getName()   返回由此抽象路径名表示的文件或目录的名称
        //注意点:
        //1.如果调用者是文件,那么获取的是文件名和后缀名
        //2.如果调用者是一个文件夹,那么获取的是问价夹的名称
        File file = new File("a.txt");
        String name = file.getName();
        System.out.println(name);//a.txt
        File files = new File("F:\\itheima");
        String name1 = files.getName();
        System.out.println(name1);//itheima
    }
    private static void method2() {
        //当前项目下的a.txt
        File file = new File("a.txt");
        boolean result = file.exists();
        System.out.println(result);
    }

    private static void method1() {
        File file = new File("F:\\itheima\\a.txt");
        boolean directory = file.isDirectory();
        boolean files = file.isFile();
        System.out.println(directory);//false
        System.out.println(files);//true
    }
}
listFiles()
public class FileDemo6 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        File[] files = file.listFiles();
        for (File path : files) {
            System.out.println(path);
        }
        //进入文件夹,获取这个文件夹里面所有的问价和文件夹的File对象,并把这些File对象都放在一个数组中返回
        //包括隐藏问价和隐藏文件夹都可以获取

        //注意事项
        //1.当调用者是一个文件时,返回一个null
        //2.当调用者是一个空文件夹时,会返回一个长度为0的数组
        //3.当调用者是一个有内容的文件夹时,会进入这个文件夹获取里面所有的文件
        //4.当调用者是一个有权限才能进入的文件夹时,也会返回null
    }
}
小练习

练习一:在当前模块下的aaa文件夹中创建一个a.txt文件

public class FileTest1 {
    public static void main(String[] args) throws IOException {
        //练习一:在当前模块下的aaa文件夹中创建一个a.txt文件
        //注意点:
        //文件所在的文件夹必须要存在,否则就会报错
        File file = new File("file_io\\aaa");
        if (!file.exists()){
            //如果文件夹不存在我们就创建
            file.mkdirs();
        }
        File newFile = new File(file,"a.txt");
        newFile.createNewFile();
    }
}

练习二:删除一个多级文件夹

  • 案例需求

    删除一个多级文件夹

  • 实现步骤

    • 定义一个方法,接收一个File对象
    • 遍历这个File对象,获取它下边的每个文件和文件夹对象
    • 判断当前遍历到的File对象是文件还是文件夹
    • 如果是文件,直接删除
    • 如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递
    • 参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹
  • 代码实现

public class FileTest2 {
    public static void main(String[] args) {
        //练习二:删除一个多级文件夹
        File src = new File("F:\\itheima\\ccc\\ddd\\hhh");
        deleteDir(src);
    }

    private static void deleteDir(File src) {
        //先删除所有内容
        //递归  方法在方法体中自己调用自己
        //1.进入
        File[] files = src.listFiles();
        //2.遍历
        for (File file : files) {
            if(file.isFile()){
                //3.判断  如果遍历到的是一个文件直接删除
                file.delete();
            }else {
                //4.判断  如果是文件夹递归
                deleteDir(file);
            }
        }
        //最后再删除这个文件夹
        src.delete();
    }
}

练习三:统计一个文件夹中,每种文件出现的次数.

  • 案例需求

    统计一个文件夹中每种文件的个数并打印

    打印格式如下:

      		txt:3个
    
      		doc:4个
    
      		jpg:6个
    
      	 …
    
  • 实现步骤

    • 定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
    • 遍历File对象,获取它下边的每一个文件和文件夹对象
    • 判断当前File对象是文件还是文件夹
    • 如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
      • 没出现过,将这种类型文件的后缀名存入集合中,次数存1
      • 出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
    • 如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象
  • 代码实现

public class Test3 {
    public static void main(String[] args) {
        //统计一个文件夹中,每种文件出现的次数.
        //统计 --- 定义一个变量用来统计. ---- 弊端:同时只能统计一种文件
        //利用map集合进行数据统计,键 --- 文件后缀名  值 ----  次数

        File file = new File("filemodule");
        HashMap<String, Integer> hm = new HashMap<>();
        getCount(hm, file);
        System.out.println(hm);
    }
  
	//1.定义一个方法,参数是HashMap集合用来统计次数和File对象要统计的文件夹
    private static void getCount(HashMap<String, Integer> hm, File file) {
      	//2.遍历File对象,获取它下边的每一个文件和文件夹对象
        File[] files = file.listFiles();
        for (File f : files) {
          	//3.判断当前File对象是文件还是文件夹
            if(f.isFile()){
              	//如果是文件,判断这种类型文件后缀名在HashMap集合中是否出现过
                String fileName = f.getName();
                String[] fileNameArr = fileName.split("\\.");
                if(fileNameArr.length == 2){
                    String fileEndName = fileNameArr[1];
                    if(hm.containsKey(fileEndName)){
                        //出现过,获取这种类型文件的后缀名出现的次数,对其+1,在存回集合中
                        Integer count = hm.get(fileEndName);
                        //这种文件又出现了一次.
                        count++;
                        //把已经出现的次数给覆盖掉.
                        hm.put(fileEndName,count);
                    }else{
                        // 没出现过,将这种类型文件的后缀名存入集合中,次数存1
                        hm.put(fileEndName,1);
                    }
                }
            }else{
              //如果是文件夹,递归调用自己,HashMap集合就是参数集合,File对象是当前文件夹对象代码实现
                getCount(hm,f);
            }
        }
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM