common-io的使用(十二)

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了 压缩和解压缩文件(十一),如果没有看过,请观看上一章

一. 为什么出现 common-io?

我们可以通过 字节操作流 InputStream,OutputStream 或者 字符操作流 Reader,Writer 来读取和写入文件内容,进行复制文件,复制文件夹等操作, 但这些操作流程固定,写起来复杂,并且效率较低,能不能有一个工具jar包,来帮我们实现简单的功能呢?

Apache 提供了对 IO流的操作的jar包, common-io.

下载使用版本 2.4

在这里插入图片描述
添加 common-io.jar包的依赖,我们主要使用的是 org.apache.commons.io.FileUtils 工具类。

下面,老蝴蝶介绍几个常用的功能。

二. 统计文件和目录的大小,比较文件的内容是否一致

二.一 方法

方法作用
static long sizeOf(File file)统计文件的大小
static long sizeOfDirectory(File directory)统计文件夹的大小
static boolean contentEquals(File file1, File file2)比较两个文件的内容是否相同

二.二 演示

源代码:

有图片

二.二.一 统计文件和文件夹的大小

 @Test
    public void sizeTest() throws Exception{

        String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello3.txt";

        String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"a";

        File file=new File(filepath);

        File dirFile=new File(dirpath);
        //文件的大小

        System.out.println("Hello3文件大小:"+FileUtils.sizeOf(file));
        //文件夹的大小
        System.out.println("a文件夹的大小:"+FileUtils.sizeOfDirectory(dirFile));

    }

运行程序,控制台打印输出:

在这里插入图片描述
查看源代码和运行结果,会发现 sizeOfDirectory() 会递归查询该文件夹下的所有文件的大小。

二.二.二 比较文件内容是否相同 contentEquals()

修改 data.txt, data2.txt, data3.txt 文件的内容

有图片

data.txt 设置内容为:

你好啊,我是两个蝴蝶飞

data2.txt 设置内容为:

你好啊,我是岳泽霖

data3.txt 设置内容为:

你好啊,我是两个蝴蝶飞

data.txt 与 data3.txt 的文件内容相同。

  @Test
    public void contentEqualsTest() throws Exception{

        File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data.txt");

        File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data2.txt");

        File file3=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data3.txt");
        //文件的大小

        System.out.println("文件1与文件2内容是否相同:"+FileUtils.contentEquals(file1,file2)); //false
        System.out.println("文件3与文件2内容是否相同:"+FileUtils.contentEquals(file3,file2)); //false
        System.out.println("文件1与文件3内容是否相同:"+FileUtils.contentEquals(file1,file3));//true

    }

运行程序,控制台打印输出:

有图片

三. 读取文件内容

可以直接读取成字符串,也可以读取成字节数组, 可以按行。

三.一 方法

方法作用
static String readFileToString(File file)读取文件内容,转换成字符串
static byte[] readFileToByteArray(File file)读取文件内容,转换成字节数组
static List readLines(File file)按行读取文件

三.二 演示 读取文件内容

@Test
    public void readTest() throws Exception{

        String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello3.txt";

        File file=new File(filepath);

        //读出内容字符串

        String content=FileUtils.readFileToString(file,"UTF-8");

        System.out.println("内容:"+content);

        //读出字节
        byte[] bytes=FileUtils.readFileToByteArray(file);

        System.out.println("输出字节内容:"+new String(bytes));

        System.out.println("------------读取行信息---------");

        //按行读取,对每一行进行相应的处理
        List<String> lines=FileUtils.readLines(file,"UTF-8");

        for(String str:lines){
            System.out.println(str);
        }
    }

运行程序,控制台打印输出:

有图片

四. 写入文件内容

可以写入字符串,可以写入字节数组, 也可以按行写入集合。

四.一 方法

方法作用
static void write(File file, CharSequence data, String encoding)往文件里面写字符串内容
static void writeByteArrayToFile(File file, byte[] data)往文件里面写字节
static void writeLines(File file, String encoding, Collection<?> lines)往文件里面写多个行
static void writeStringToFile(File file, String data, String encoding)往文件里面写字符串

写入方法可以重载, 后面都可以有一个 boolean append, 是追加还是重写。

四.二 演示 写入文件内容

 @Test
    public void writeTest() throws Exception{


        String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello3.txt";

        File file=new File(filepath);

       System.out.println("**************************");
        //写入字符串,追加
        FileUtils.writeStringToFile(file,"新数据","UTF-8",true);
        //写入字节,追加
        FileUtils.writeByteArrayToFile(file,"我去,新数据".getBytes("UTF-8"),true);

        //按行写入,会换行的。
        List<String> lineList=new ArrayList<String>();

        lineList.add("A");

        lineList.add("B");

        lineList.add("C");
        //按行写入,追加
        FileUtils.writeLines(file,"UTF-8",lineList,true);

        //重新读取
        System.out.println("再读:"+FileUtils.readFileToString(file,"UTF-8"));
    }

运行程序,控制台打印输出:

有图片

五. 创建文件

可以创建不存在的文件,也可以创建递归的文件。 如果文件已经存在,就不创建,并且不报错。

五.一 方法

方法作用
static void touch(File file)创建文件

五.二 演示 touch() 方法

  @Test
    public void touchTest() throws Exception{

        File file1=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"A.txt");
        //新建单个文件
       FileUtils.touch(file1);

        File file2=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"新建"+File.separator+"B"+File.separator+"C"+File.separator+"d.txt");
        //新建递归文件夹
        FileUtils.touch(file2);
    }

运行程序,查看文件系统

有图片

六. 展示文件夹中的文件

与以前的listFiles() 方法差不多,提供了多种过滤器的支持。

过滤器位于 org.apache.commons.io.filefilter 包下。

在这里插入图片描述

六.一 方法

方法作用
static Collection listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)传入目录,文件过滤器,目录过滤器,返回值是集合
static Iterator iterateFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)传入目录,文件过滤器,目录过滤器,返回值是迭代器

六.二 演示

可以进行 前缀,后缀,递归,不为空 等多种形式的过滤, 支持组合 and,or 。


    @Test
    public void listFileTest(){
        String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc";
        File dirFile=new File(dirpath);

        System.out.println("***********第一种形式***********");
        //不为空文件,即文件的大小不能为 0
      Collection<File> cFiles=FileUtils.listFiles(dirFile, EmptyFileFilter.NOT_EMPTY,null);

      for(File f:cFiles){
          System.out.println("输出路径:"+f.getAbsolutePath());
      }

        System.out.println("***********第二种形式*******");

      //加上 AndDirs 表示 递归展示。
      Iterable<File > cFileIts= FileUtils.listFilesAndDirs(dirFile,EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);

        for(File f:cFileIts){
            System.out.println("输出路径:"+f.getAbsolutePath());
        }
        System.out.println("**********第三 种形式********");

        //后缀形式
       cFiles=FileUtils.listFiles(dirFile, new SuffixFileFilter(".txt"),DirectoryFileFilter.INSTANCE);
        for(File f:cFiles){
            System.out.println("输出路径:"+f.getAbsolutePath());
        }

        System.out.println("***********第四种形式*******");
        //或者 or 的形式, 开头是 data 或者  结尾是 CHM
        cFiles=FileUtils.listFiles(dirFile,
                FileFilterUtils.or(new PrefixFileFilter("data"),new SuffixFileFilter(".CHM"))
                ,DirectoryFileFilter.INSTANCE);
        for(File f:cFiles){
            System.out.println("输出路径:"+f.getAbsolutePath());
        }

        System.out.println("***********第五种形式*******");

        // and 和的形式
        cFiles=FileUtils.listFiles(dirFile,
                FileFilterUtils.and(new PrefixFileFilter("data"),new SuffixFileFilter(".txt"))
                ,DirectoryFileFilter.INSTANCE);
        for(File f:cFiles){
            System.out.println("输出路径:"+f.getAbsolutePath());
        }

    }

运行程序,查看控制台内容:

有图片

七. 复制,移动文件和文件夹

七.一 方法

方法作用
static void copyDirectory(File srcDir, File destDir)复制目录
static void copyDirectory(File srcDir, File destDir, FileFilter filter)只复制符合条件的目录
static void copyDirectoryToDirectory(File srcDir, File destDir)复制目录到另外一个目录
static void copyFile(File srcFile, File destFile)复制文件
static void copyFileToDirectory(File srcFile, File destDir)复制文件到目录
static void copyInputStreamToFile(InputStream source, File destination)复制输入流到文件
static void copyURLToFile(URL source, File destination)复制url到文件
static void deleteDirectory(File directory)删除目录
static void forceDelete(File file)递归删除文件
static void forceMkdir(File directory)递归创建目录
static void moveDirectory(File srcDir, File destDir)移动目录
static void moveFile(File srcFile, File destFile)移动文件
static void moveFileToDirectory(File srcFile, File destDir, boolean createDestDir)移动文件到目录
static void moveToDirectory(File src, File destDir, boolean createDestDir)移动到目录
static void moveDirectoryToDirectory(File src, File destDir, boolean createDestDir)移动目录到目录

七.二 演示 复制,移动

@Test
    public void fileOperTest() throws Exception{
        String filepath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"data.txt";

        String filepathCopy="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"datacopy.txt";

        String dirpath="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"a";

        String dirpathCopy="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"acopy";

        File file=new File(filepath);

        File dirFile=new File(dirpath);

        //复制文件
        FileUtils.copyFile(file,new File(filepathCopy));
        //复制目录
        FileUtils.copyDirectory(dirFile,new File(dirpathCopy));

        //复制文件到目录
        //FileUtils.copyFileToDirectory(new File(filepathCopy),new File(dirpathCopy));

        //复制目录到目录
        FileUtils.copyDirectoryToDirectory(dirFile,new File(dirpathCopy));

        //移动

       // FileUtils.moveFile(new File(filepathCopy),new File(file));
        //移动文件到目录
        FileUtils.moveFileToDirectory(new File(filepathCopy),new File(dirpathCopy),true);

        //FileUtils.moveDirectory();

       // FileUtils.moveDirectoryToDirectory();

        //删除文件
        FileUtils.deleteDirectory(dirFile);
    }

运行程序,查看文件系统

有图片

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值