Java IO 01 File & 递归

1 File

1.1 介绍

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

1.2 File类的三种构造函数
// File构造函数1 File( String pathname)
String pathName = "/Users/Mac/mydata/iotest.txt";
File f1 = new File(pathName);
System.out.println(f1);

// 构造函数2 File( String parent, String child)
File f2 = new File("/Users/Mac/mydata", "iotest.txt");
System.out.println(f2);

// 构造函数3 File( File parent, String child)
File dir = new File("/Users/Mac/mydata");
File f3 = new File(dir, "iotest.txt");
System.out.println(f3);
1.3 File 类的获取
// 创建文件对象
File file = new File("iodemo.txt");
// 1 获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();
System.out.println(absPath); // /Users/Mac/Documents/workspace/eclipse_workspace/TestJava/iodemo.txt
// 2 File中封装的路径是什么获取到的就是什么。
String path = file.getPath();
System.out.println(path); // iodemo.txt
// 3 获取文件名称
String filename = file.getName();
System.out.println(filename); // iodemo.txt
// 4 获取文件大小
long size = file.length();
System.out.println(size);// 0
1.4 文件和文件夹的创建与删除
File file = new File("file.txt");
// 1 创建文件,如果文件不存在,创建并返回true;如果文件存在,则不创建并返回false。如果路径错误,IOException。
boolean b1 = file.createNewFile();
System.out.println("b1 create =" + b1);
// -----------删除文件操作-------注意:不去回收站。慎用------
boolean b2 = file.delete();
System.out.println("b2 delete =" + b2);

// -----------判断文件是否存在------------
boolean b3 = file.exists();
System.out.println("b3 exist =" + b3);

// -----------对目录操作 创建,删除,判断------------
File dir = new File("/Users/Mac/mydata/iotest");
// mkdir()创建单个目录。//dir.mkdirs();创建多级目录
boolean b4 = dir.mkdir();
System.out.println("b4 mkdir =" + b4);
// 删除目录时,如果目录中有内容,无法直接删除。
boolean b5 = dir.delete();
// 只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
System.out.println("b5 delete=" + b5);

// -----------判断文件,目录------------
File f = new File("/Users/Mac/mydata");// 要判断是否是文件还是目录,必须先判断存在。
if (f.exists()) {
    System.out.println(f.isFile());
    System.out.println(f.isDirectory());
}


// 结果:
b1 create =true
b2 delete =true
b3 exist =false
b4 mkdir =true
b5 delete=true
false
true

注意:

  • 删除文件操作,将文件直接删除,文件不放入回收站。
  • mkdir()创建单个目录,mkdirs() 创建多级目录。
  • 删除目录时,如果目录中有内容,无法直接删除。
  • 判断路径是目录还是文件时,先要判断它是否存在。
1.5 listFiles() 方法

示例:

File dir = new File("/Users/Mac/mydata");

// 1 获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for (String name : names) {
    System.out.println(name);
}
// 2 获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for (File file : files) {
    System.out.println(file);
}
1.6 文件过滤器

1)FilenameFilter

// 自定类继承 FilenameFilter 过滤器接口
public class MyFileFilter implements FilenameFilter {
    @Override
    public boolean accept(File dir, String name) {
        // TODO Auto-generated method stub
        return name.endsWith(".txt");
    }
}

// 测试类
public class TestSth {

    public static void main(String[] args) throws IOException {
        // 获取扩展名为.txt所有文件
        // 1 创建File对象
        File file = new File("/Users/Mac/mydata");
        // 2 获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
        File[] files = file.listFiles(new MyFileFilter());
        // 3 遍历获取到的所有符合条件的文件
        for (File f : files) {
            System.out.println(f);
        }
    }
}

2) FileFilter

// 自定义类继承FileFilter过滤器接口
public class FileFileterByDir implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        // TODO Auto-generated method stub
        return pathname.isDirectory();
    }
}

// 测试类
public class TestSth {
    public static void main(String[] args) throws IOException {

        // 获取扩展名为.java所有文件
        // 1 创建File对象
        File file = new File("/Users/Mac/mydata");
        // 2 获取指定目录下的文件夹
        File[] files = file.listFiles(new FileFileterByDir());
        // 3 遍历获取到的所有符合条件的文件
        for (File f : files) {
            System.out.println(f);
        }
    }
}

3)总结

FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。

FileFilter 过滤器中的accept方法接受一个参数,这个参数就当前文件或文件夹对象。

当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。

2 递归

2.1 介绍

递归,指在当前方法内调用自己的这种现象。

递归分为两种,直接递归和间接递归:

  • 直接递归为方法自身调用自己。
  • 间接递归可以是A方法调用B方法,B方法调用C方法,C方法调用A方法。

示例:计算累加和

public static int getSum(int n) {
    if (n == 1) {
        return 1;
    }
    return n + getSum(n - 1);
}

public static void main(String[] args) {
    // 计算1~num的和,使用递归完成
    int n = 5;
    int sum = getSum(n);
    System.out.println(sum);
}

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

2.2 递归打印所有子目录中的文件路径
// 获取指定目录以及子目录中的所有的文件
public static void getFileAll(File file) {
    File[] files = file.listFiles();
    // 遍历当前目录下的所有文件和文件夹
    for (File f : files) {
        // 判断当前遍历到的是否为目录
        if (f.isDirectory()) {
            // 是目录,继续获取这个目录下的所有文件和文件夹
            getFileAll(f);
        } else {
            // 不是目录,说明当前f就是文件,那么就打印出来
            System.out.println(f);
        }
    }
}

public static void main(String[] args) {
    File file = new File("/Users/Mac/mydata");
    getFileAll(file);
}
2.3 搜索目录中的指定文件(含子目录)
// 将上面代码中listFiles()方法中加入过滤器
File[] files = file.listFiles(new MyFileFilter());

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81147026
今日推荐