文件io-01-File

1.io概述

当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
因此我们把这种输入和输出动作称为IO操作。

2.了解file

2.1File类的构造函数

在这里插入图片描述

    public static void main(String[] args) {
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\面试\\host.txt");

        System.out.println(file1);

        File file2 = new File("C:\\Users\\Administrator\\Desktop\\面试\\", "host.txt");
        System.out.println(file2);

        File file3 = new File("C:\\Users\\Administrator\\Desktop\\面试\\");
        File filep3 = new File(file3, "host.txt");
        System.out.println(filep3);

    }
}

2.file类的方法获取

2.3File类的获取

``java
@Test
public void fileFuntionDemo(){
File file1 = new File(“C:\Users\Administrator\Desktop\面试\host.txt”);

    //获取文件的绝对路径
    File absoluteFile = file1.getAbsoluteFile();
    //File中封装的路径是什么获取到的就是什么。
    String path = file1.getPath();
    //获取文件名称
    String name = file1.getName();
    //获取文件大小
    long length = file1.length();

    System.out.println("--绝对路径--"+absoluteFile);
    System.out.println("--相对路径--"+path);
    System.out.println("--文件名称--"+name);
    System.out.println("--文件大小--"+length);//单位 : 字节
}
```

3.文件和文件夹的创建删除等

经常上面介绍,我们知道可以通过File获取到文件名称,文件路径(目录)等信息。
接下来演示使用File类创建、删除文件等操作。
在这里插入图片描述

   public static void main(String[] args) throws IOException {
        File file = new File("/Users/mac/Desktop/cosmics/");

        if (file.isDirectory()){
            File file1 = new File(file, "bb.txt");
            if(!file1.isFile()){
                boolean newFile = file1.createNewFile();
                if (newFile){
                    File file2 = new File("/Users/mac/Desktop/cosmics/aa/");

                    file2.mkdir();
                }
            }
                
        }
    }

4.listFiles()方法介绍

   文件都存放在目录(文件夹)中,那么如何获取一个目录中的所有文件或者目录中的文件夹呢?那么我们先想想,一个目录中可能有多个文件或者文件夹,那么如果File中有功能获取到一个目录中的所有文件和文件夹,那么功能得到的结果要么是数组,要么是集合。我们开始查阅API。

在这里插入图片描述

   @Test
    public void listFileDemo(){
        File file = new File("/Users/mac/Desktop/cosmics/");

        String[] list = file.list();

        for (String s : list) {
            System.out.println(s);
        }

        System.out.println("--------------");

        File[] files = file.listFiles();

        for (File file1 : files) {
            System.out.println(file1);

        }

在这里插入图片描述

5.文件过滤器

通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?
我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,Java给我们提供相应的功能来解决这个问题。
查阅File类的API,在查阅时发现File类中重载的listFiles方法,并且接受指定的过滤器

在这里插入图片描述

  @Test
    public void fileFilterDemo(){
        File file = new File("/Users/mac/Desktop/cosmics/");

        File[] files = file.listFiles(new MyFileFilter());
        for (File file1 : files) {
            System.out.println(file1);
        }
    }
    
class MyFileFilter implements FilenameFilter {

    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".zip");
    }
}

在查阅API时,我们发现,在listFiles(FileFilter filter) 也可以接受一个FileFilter过滤器,它和我们讲的FilenameFilter有啥区别呢?
在这里插入图片描述
FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。
FileFilter 过滤器中的accept方法接受一个参数,这个参数就当前文件或文件夹对象
当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。

   @Test
    public void fileFilterDemo(){
        File file = new File("/Users/mac/Desktop/cosmics/");

        File[] files = file.listFiles(new MyFileFilter());
        for (File file1 : files) {
            System.out.println(file1);
        }
    }
class MyFileFilter implements FileFilter{

    @Override
    public boolean accept(File pathname) {
        return pathname.isDirectory();
    }
}

3.递归

递归,指在当前方法内调用自己的这种现象
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

    @Test
    public void recursionDemo(){
        //计算1-n之间的和,使用递归完成
        int  n=5;
        int num=recursionMethod(n);
        System.out.println(num);
    }

    private int recursionMethod(int n) {
        if (n==1){
            return n;
        }
        return recursionMethod(n-1)+n;
    }

注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

3.1递归打印所有子目录中的文件路径

编写一个方法用来打印指定目录中的文件路径,并进行方法的调用
要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
代码演示

   @Test//递归打印所有子目录中的文件路径
    public void printFileAndSub() {
        File file = new File("/Users/mac/Desktop/cosmics/");

        recursionFile(file);

    }

    private void recursionFile(File file) {
        File[] files = file.listFiles();

        for (File file1 : files) {
            if (file1.isDirectory()){
                recursionFile(file1);
            }else{
                System.out.println(file1.getName());
            }
        }

    }

总结

4.1知识点总结
递归: 方法定义中调用方法本身的现象
直接递归
public void methodA(){
methodA();
}
间接递归
public void metohdB(){
methodC();
}
public void methodC(){
methodB();
}
递归注意实现
✪要有出口,否则就是死递归
✪次数不能太多,否则就内存溢出

File: 文件和目录路径名的抽象表示形式
构造方法:
public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象
public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象
public File(File parent, String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象

路径的分类:
绝对路径, 带盘盘符
E:\Workspace\day20_File\abc.txt
相对路径, 不带盘符

注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为项目的根目录

方法
public boolean createNewFile()创建文件
返回值为true, 说明创建文件成功
返回值为false,说明文件已存在,创建文件失败
public boolean mkdir() 创建单层文件夹
创建文件夹成功,返回 true
创建文件夹失败,返回 false
public boolean mkdirs() 创建多层文件夹
public boolean delete()
删除此抽象路径名表示的文件或目录。
如果此路径名表示一个目录,则该目录必须为空才能删除
public boolean isDirectory() 判断是否为文件夹
public boolean isFile() 判断是否为文件
public boolean exists() 判断File对象对应的文件或文件夹是否存在
public String getAbsolutePath() 获取当前File的绝对路径
public String getName() 获取当前File对象的文件或文件夹名称
public long length() 获取当前File对象的文件或文件夹的大小(字节)
public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值