File和IO流 --- [T]

88 阅读1分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

File和IO流概述:

首先思考:以前是如何存储数据的?

int a = 10;
int [] arr = {1,3,4,5};
ArrayList<String> list = new ArrayList<>();

用变量,数组,集合。在内存中记录。

弊端是什么?

不能永久化存储,只要代码运行结束,所有数据都会丢失。

思考:计算机中,有没有一个硬件可以永久化存储?

image.png

硬盘可以。内存不行。

我们可以对硬盘进行那些操作?

image.png

对文件进行读写的前提条件?

image.png

小结: IO流是什么?

  1. 可以将数据从本地文件中读取出来
  2. 可以将数据从内存保存到本地文件

File类是什么? 1.在读写数据时告诉虚拟机要操作的(文件/文件夹)在哪? 2.对(文件/文件夹)本身进行操作。包括创建,删除等。

File类概述和构造方法:

image.png


public class FileDemo3 {
   public static void main(String[] args) throws IOException {
//        method1();
//        method2();
       method3();
       
       // 疑问:既然mkdirs能创建单级,也能创建多级,那是不是mkdir 就没用了呢? 是的,所以
       // mkdir 只是了解就可以。
   }
   public static void method1() throws IOException {
       // public boolean createNewFile() 创建一个新的空的文件
       // 注意点:1. 如果文件存在,那么创建失败,返回false
       //        2. 如果文件不存在,那么创建成功,返回true
       //        3. createNewFile 只能创建文件
       File file1 = new File("D:\2021_java_learn\itheima\a.txt");
       boolean result = file1.createNewFile();
       System.out.println(result);
   }
   
   public static void method2() throws IOException {
       // public boolean mkdir() 创建一个单级文件夹
       // 注意点:1. 只能创建单级文件夹, 不能创建多级文件夹
       // 2. mkdir 只能创建单级文件夹
       File file1 = new File("D:\2021_java_learn\itheima\bbb\bbb");
       boolean result = file1.mkdir();
       System.out.println(result);
   }

   public static void method3() throws IOException {
       // public boolean mkdirs() 创建一个多级文件夹
       // 注意点:1. 可以创建单级文件夹,也可以创建多级文件夹
       // 2. mkdirs 只能创建文件夹
       File file1 = new File("D:\2021_java_learn\itheima\ccc\ccc\ccc");
       boolean result = file1.mkdirs();
       System.out.println(result);
   }

}

File类删除功能

image.png

public class FileDemo4 {
   // 注意点:
   // 1. 删除不走回收站。
   // 2. 如果删除的是文件,那么直接删除,如果删除的是文件夹,那么能删除空文件夹
   // 3. 如果要删除一个有内容的文件夹,只能先进入到这个文件夹,把里面的内容全部删除完毕,才能
   // 再次删除这个文件夹。
   // 简单的来说:
   // 只能删除文件和空文件夹。
   public static void main(String[] args) {
//        File file = new File("D:\2021_java_learn\itheima\a.txt");
//        boolean result = file.delete();
//        System.out.println(result);

       File file1 = new File("D:\2021_java_learn\itheima");
       boolean result1 = file1.delete();
       System.out.println(result1);

   }
}

File类判断和获取功能

image.png

    // public boolean isDirectory()  File是否为目录
    // public boolean isFile()  File是否为文件
    // public boolean exists()  File是否存在
    // public boolean getName()  返回由此抽象路径名表示的文件或目录的名称
    // 调用者是文件,获得的是文件名和后缀名
    // 调用者是文件夹,获得的是文件夹名
    public static void main(String[] args) {
//        method1();
//        method2();
//        method3();

        File file1 = new File("a.txt");
        String name = file1.getName();
        System.out.println(name);

        File file2 = new File("D:\2021_java_learn\itheima");
        String name1 = file2.getName();
        System.out.println(name1);
        

    }
    public static void method3(){
        File file1 = new File("a.txt");
        boolean result = file1.exists();
        System.out.println(result);
    }
    public static void method2(){
        File file1 = new File("D:\2021_java_learn\itheima");
        boolean result1 = file1.isFile();
        boolean result2 = file1.isDirectory();
        System.out.println(result1);
        System.out.println(result2);
    }
    
    public static void method1(){
        File file1 = new File("D:\2021_java_learn\itheima\a.txt");
        boolean result1 = file1.isFile();
        boolean result2 = file1.isDirectory();
        System.out.println(result1);
        System.out.println(result2);
    }
}

File类高级获取功能

image.png

public class FileDemo6 {
    public static void main(String[] args) {
        File file = new File("D:\");
        File[] files = file.listFiles(); // 返回值是一个File类型的数组
        for (File path: files) {
            System.out.println(path);
        }

        // 进入文件夹,获取这个文件夹里面所有的文件和文件夹的File对象,并把这些File对象都放在
        // 一个数组中返回
        // 包括隐藏文件。和隐藏文件夹,都可以获取。
        
        // 注意事项:
        // 1.当调用者是一个文件时
        // 2.当调用者是一个空文件夹时
        // 3.当调用者是一个有内容的文件夹时。
        // 4.当调用者是一个有权限才能进入的文件夹时。
        
    }
}

image.png

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

// 注意点:文件所在的文件夹必须要存在
public class Test1 {
    public static void main(String[] args) throws IOException {
        File file = new File("filemodule\aaa");
        if (!file.exists()){
            // 如果文件夹不存在就创建
            file.mkdirs();
        }
        File newFile = new File(file,"a.txt");
        newFile.createNewFile();
    }
}

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

public class Test2 {
    public static void main(String[] args) {
        // delete 方法
        // 只能删除文件和空文件夹
        // 如果现在要删除 一个用内容的文件夹?
        // 先删掉这个文件夹里面所有的内容
        // 最后在删除这个文件夹
        File src = new File("D:\dd\dd\dd\dd");
        deleteDir(src);
    }

    private static void deleteDir(File src){
        // 1. 进入 -- 得到src文件夹里面所有内容的File对象
        File[] files = src.listFiles();
        // 2. 遍历 --- 因为我想得到src文件夹里面每一个文件和文件夹的File对象
        for (File file: files) {
            if (file.isFile()){
                // 3. 判断 --- 如果是文件,就直接删除
                file.delete();
            }else {
                // 4. 是文件夹  递归
                deleteDir(file);
            }
        }
        // 最后删除这个文件夹
        src.delete();
    }
}

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

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);
    }

    private static void getCount(HashMap<String, Integer> hm, File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if(f.isFile()){
                String fileName = f.getName();
                String[] fileNameArr = fileName.split("\\.");
                if(fileNameArr.length == 2){
                    String fileEndName = fileNameArr[1];
                    if(hm.containsKey(fileEndName)){
                        //已经存在
                        //将已经出现的次数获取出来
                        Integer count = hm.get(fileEndName);
                        //这种文件又出现了一次.
                        count++;
                        //把已经出现的次数给覆盖掉.
                        hm.put(fileEndName,count);
                    }else{
                        //不存在
                        //表示当前文件是第一次出现
                        hm.put(fileEndName,1);
                    }
                }
            }else{
                getCount(hm,f);
            }
        }

    }
}