文件操作学习(一)文件读写

java 对于文件的操作

对于文件的读写,小猿就不按照往常的文章框架来写这篇文章,小猿以案例为主来编写本章笔记。

文件的创建

文件的创建比较简单,采用 File file = new File(“xxx”) 既可创建文件夹也可以创建文件,对于本小结的内容小猿就不做过多的探讨。

文件的删除

对于文件的删除,小猿就直接献上案例,用java代码直接删除小猿创建的测试文件。
测试代码

public class Demo01Test {
    public static void main(String[] args) {
        File file = new File("G:\\test");
        deleteAllFile(file);
    }
    public  static  void deleteAllFile(File file){
        System.out.println("-----------------------");
        File[] files = file.listFiles();
        for (File file1 : files) {
            if(file1.isDirectory()){
                System.out.println("delete file"+file1);
                deleteAllFile(file1);
            }else{
                file1.delete();
            }
        }
        System.out.println("delete directory:"+file);
        file.delete();
        System.out.println("-------------------------");
    }
}

测试结果
在这里插入图片描述

文件查找

案例一的功能需求是展示所有文件夹,代码实现如下所示。

public class Demo04Recurison {
    public static void main(String[] args) {
        File file = new File("G:\\test");
        getAllFile(file);
    }
    public static void getAllFile(File dir){
        System.out.println(dir);
        File[] files = dir.listFiles();
        for (File f :
                files) {
            if (f.isDirectory()){
                getAllFile(f);
            }else {
                System.out.println(f);
            }
        }
    }
}

测试结果
在这里插入图片描述
测试结果表明所有搜索的文件及文件夹都没有任何问题。

案例二

案例二的需求为输出所有以.txt结尾的文件。先上代码,如下所示。

public class Demo04Recurison {
    public static void main(String[] args) {
        File file = new File("G:\\test");
        findAllFiles(file);
    }
    public static void findAllFiles(File dir){
        File[] files = dir.listFiles();
        for (File f :
                files) {
            if (f.isDirectory()) {
                findAllFiles(f);
            }else{
                if(f.toString().toLowerCase().endsWith(".txt")){
                    System.out.println(f);
                }
            }
        }
    }
}

在这里插入图片描述
总而言之,文件搜索的整体思路就是在循环递归遍历文件时,对目标文件进行条件判断,从而选取目标文件。
而搜索文件过滤器,上述代码的缺点就是代码一旦形成就意味着代码的功能就固定了,要想实现不同的功能就必须重新写代码,要想改变这种现状,就必须采用接口给文件搜索功能定义一个固定的模板,

案例三

采用FileFilter过滤器实现文件查找,FileFilter源代码如下。

@FunctionalInterface
public interface FileFilter {
    /**
     * Tests whether or not the specified abstract pathname should be
     * included in a pathname list.
     *
     * @param  pathname  The abstract pathname to be tested
     * @return  <code>true</code> if and only if <code>pathname</code>
     *          should be included
     */
    boolean accept(File pathname);
}

注意,此处接口函数为什么没有abstract类,因为接口默认都是加了abstract函数,且看下面代码。
在这里插入图片描述
所以在FileFilter中并没有见到abstract字样,下文小猿将分别用匿名内部类和lambda表达式实现文件过滤案例
方法一(匿名内部类)
小猿直接上代码,首先来写FileFilter接口实现类。

public class FileFilterImpl implements FileFilter{
    @Override
    public boolean accept(File pathname) {
        /*
            过滤的规则:
            在accept方法中,判断File对象是否是以.java结尾
            是就返回true
            不是就返回false
         */
        //如果pathname是一个文件夹,返回true,继续遍历这个文件夹
        if(pathname.isDirectory()){
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}

测试类

public class Demo01Filter {
    public static void main(String[] args) {
        File file = new File("c:\\abc");
        getAllFile(file);
    }
    public static void getAllFile(File dir){
        File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象
        for (File f : files) {
            if(f.isDirectory()){
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
    }
}

方法二(Lambda 表达式实现)
为了复习和巩固上节课采用lambda表达式,方法二将将接口实现类变成lambda表达式

public class Demo02Test {
    public static void main(String[] args) {
        File file = new File("G:\\test");
        getTargetFile(file);
    }
    public static void getTargetFile(File dir){
        //采用匿名内部类的方式
        File [] files =null;
        /*files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
            }
        });
        //采用lambda表达式。
        files=dir.listFiles((File pathname)->{
            return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
        });*/
        //优化lambda 表达式
        files=dir.listFiles((pathname)-> pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("txt"));

        for (File file :
                files) {
            if (file.isDirectory()){
                getTargetFile(file);
            }else {
                System.out.println(file);
            }
        }
    }
}

测试结果:
在这里插入图片描述
到此为止,文件的相关操作已经复习完毕,下一章节将复习文件流有关的操作。

猜你喜欢

转载自blog.csdn.net/xueshanfeitian/article/details/106857942
今日推荐