Java程序员的日常—— FileUtils工具类的使用

package cn.xingoo.learn.commons;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.junit.Test;

import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.zip.CRC32;

/**
 * FileUtils支持很多文件操作,如
 *
 * 文件写入
 * 读取文件
 * 创建目录
 * 拷贝文件和目录
 * 删除文件和目录
 * 从URL转换
 * 基于统配和过滤查看文件和目录
 * 比较文件内容
 * 文件的更新时间
 * 检查校验码
 *
 * Created by xxh on 2016/11/24.
 */
public class FileUtilsTest {
    private static File parent = new File("D://test");
    @Test
    public void getDirTest(){
        //获得基本的信息
        System.out.println(FileUtils.getTempDirectory());//获取临时目录 java.io.tmpdir,getUserDirectoryPath返回路径字符串
        System.out.println(FileUtils.getUserDirectory());//获取用户主目录 user.home,getUserDirectoryPath返回路径字符串

        //以可读的方式,返回文件的大小EB, PB, TB, GB, MB, KB or bytes
        System.out.println(FileUtils.byteCountToDisplaySize(10000000));
        System.out.println(FileUtils.byteCountToDisplaySize(1));
    }

    @Test
    public void openStream() throws IOException {
        //获取文件输入和输出的文件流
        //文件是目录或者不存在,都会跑出异常
        InputStream in = FileUtils.openInputStream(new File("D://test/test1"));
        OutputStream out = FileUtils.openOutputStream(new File("D://test/test2"));
        out = FileUtils.openOutputStream(new File("D://test/test3"),true);//是否追加的形式添加内容
    }

    @Test
    public void FileOperation() throws IOException {
        //创建文件,如果文件存在则更新时间;如果不存在,创建一个空文件
        //创建空文件的方式为:
        // final OutputStream out = openOutputStream(file);
        // IOUtils.closeQuietly(out);
        FileUtils.touch(new File("D://test/test4"));

        //文件内容的对比
        FileUtils.contentEquals(new File("D://test/test1"),new File("D://test/test2"));
        FileUtils.contentEqualsIgnoreEOL(new File("D://test/test1"),new File("D://test/test2"),null);//忽略换行符,第三个参数是字符集

        //根据URL获取文件
        FileUtils.toFile(new URL("file://D://test/test1"));
        FileUtils.toFiles(null);
        FileUtils.toURLs(new File[]{new File("D://test/test1")});

        //文件拷贝
        FileUtils.copyFileToDirectory(new File("/test1"),new File("/dir"),true);//第三个参数是否更新时间
        FileUtils.copyFile(new File("/source"),new File("/target"),true);//TODO 阅读doCopy源码

        //目录拷贝
        File srcDir = new File("/source");
        File destDir = new File("/target");

        FileUtils.copyDirectoryToDirectory(new File("/source"),new File("/target"));
        FileUtils.copyDirectory(new File("/source"),new File("/target"));

        FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY);//仅仅拷贝目录

        IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");// 创建.txt过滤器
        IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
        // 创建包含目录或者txt文件的过滤器
        FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
        // Copy using the filter
        FileUtils.copyDirectory(srcDir, destDir, filter);//TODO 阅读doCopyDirectory源码

        //文件拷贝
        FileUtils.copyInputStreamToFile(new FileInputStream("/test"),new File("/test"));
        FileUtils.copyURLToFile(new URL("file:/test"),new File("/test"));

        //删除文件
        FileUtils.deleteDirectory(new File("/test"));//删除目录下所有的内容
        FileUtils.deleteQuietly(new File("/test"));//如果是目录,会级联删除;不会抛出异常

        //判断文件是否存在
        FileUtils.directoryContains(new File("/dir"),new File("/file"));

        //清除目录中的内容,不会删除该目录;
        //先verifiedListFiles检查目录,检查目录是否为目录、是否存在,然后调用listFiles,如果返回null,则抛出异常
        //遍历目录中的文件,如果是目录则递归删除;如果是文件则强制删除,删除失败(文件不存在或无法删除)都会抛出异常
        FileUtils.cleanDirectory(new File("/dir"));//TODO verifiedListFiles  <------2016/11/24

        //等待一个文件xx秒,知道文件创建后才返回。每max(100,remainning)循环检查一次
        while(FileUtils.waitFor(new File("/dir"),60)){}

        //读取目标文件,内部调用IOUtils.toString(inputstream,"utf-8")
        String str = FileUtils.readFileToString(new File("/dir"),"utf-8");

        //内部调用IOUtils.toByteArray(in)
        byte[] bytes = FileUtils.readFileToByteArray(new File("/dir"));

        //内部调用IOUtils.readLines(in, Charsets.toCharset(encoding));
        List<String> strs = FileUtils.readLines(new File("/dir"),"utf-8");

        //内部调用IOUtils.lineIterator(in, encoding)
        FileUtils.lineIterator(new File("/dir"),"utf-8");

        //四个参数分别为:目标文件,写入的字符串,字符集,是否追加
        FileUtils.writeStringToFile(new File("/target"),"string","utf-8",true);

        //write可以接受charsequence类型的数据,string,stringbuilder和stringbuffer都是实现了charsequence接口
        FileUtils.write(new File("/target"),"target char sequence","utf-8",true);

        FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes());//(file,字符数组)
        FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),true);//(file,字符数组,是否追加)
        FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),0,10);//(file,字符数组,起始位置,结束位置)
        FileUtils.writeByteArrayToFile(new File("/target"),"bytes".getBytes(),0,10,true);//(file,字符数组,起始位置,结束位置,是否追加)

        //writeLines多了一个lineEnding参数
        FileUtils.writeLines(new File("/target"),"utf-8", FileUtils.readLines(new File("/target"),"utf-8"));

        //强制删除
        FileUtils.forceDelete(new File("/target"));

        //在JVM
        FileUtils.forceDeleteOnExit(new File("/target"));

        //强制创建文件目录,如果文件存在,会抛出异常
        FileUtils.forceMkdir(new File("/target"));

        //强制创建父级目录
        FileUtils.forceMkdirParent(new File("/xxxx/target"));

        //如果是文件,直接读取文件大小;如果是目录,级联计算文件下的所有文件大小
        FileUtils.sizeOf(new File("/target"));//返回Long
        FileUtils.sizeOfAsBigInteger(new File("/target"));//返回BigInteger
        FileUtils.sizeOfDirectory(new File("/target"));
        FileUtils.sizeOfDirectoryAsBigInteger(new File("/target"));

        //对比文件新旧
        FileUtils.isFileNewer(new File("/target"),new File("/file"));

        FileUtils.isFileOlder(new File("/target"), new Date());

        FileUtils.checksum(new File("/target"),new CRC32());
        FileUtils.checksumCRC32(new File("/target"));

        FileUtils.moveDirectory(new File("/target"),new File("/file"));
        FileUtils.moveDirectoryToDirectory(new File("/target"),new File("/file"),true);
        FileUtils.moveFile(new File("/target"),new File("/file"));
        FileUtils.moveFileToDirectory(new File("/target"),new File("/dir"),true);
        FileUtils.moveToDirectory(new File("/target"),new File("/dir"),true);

        FileUtils.isSymlink(new File("/target"));
    }

    @Test
    public void findFiles(){
        //返回文件的列表
        List<File> files = (List<File>) FileUtils.listFiles(parent,new String[]{"test1","test2"},true);//TODO 重点看一下源码

        //返回文件迭代器
        Iterator<File> files_iter =  FileUtils.iterateFiles(parent,new String[]{"test1","test3"},true);

        //把collection<File>转换成File[]
        FileUtils.convertFileCollectionToFileArray(files);
    }
}

本文转自博客园xingoo的博客,原文链接:Java程序员的日常—— FileUtils工具类的使用,如需转载请自行联系原博主。

时间: 2024-10-25 01:52:21

Java程序员的日常—— FileUtils工具类的使用的相关文章

Java程序员的日常—— Arrays工具类的使用

这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排序算法,这个还是非常有用的. 所有的方法都是在下面的类中进行测试的: public class ArraysTest { String[] array = new String[]{"a","c","2","1","b&

Java程序员的日常—— 基于类的策略模式、List&lt;?&gt;与List、泛型编译警告、同比和环比

早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今天主要的工作还是做业务需求,不过下午状态不好,看了下<Effective java>,正好重构了下代码. effective java 通过函数来作为策略 通过函数作为策略有两个要注意的地方: 使用接口作为策略传入 如果长期调用,应该设置为静态内部类,避免频繁创建过多的匿名对象 下面举个简单的例子

Java程序员的日常—— 《编程思想》关于类的使用常识

Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于构造器 在C中,如果要使用变量需要先申请内存.在Java中,如果你需要创建一个对象,也可以直接new出来,JVM会自动帮你管理. 默认的类,会自动有一个无参的构造方法,当然你也可以自己定义有参的构造方法.但是要注意,一旦自己定义了,就不再帮你自动创建无参的构造方法了. 一个类可以有多种构造方法,通过

Java程序员的日常——经验贴(纯干货)

工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar -z命令,因此如果你想要压缩或者解压tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了. 关于tar.gz可以这么理解,tar结尾的压缩包,其实只负责把文件打包,并没有进行压缩:而gz结尾的包,则是进行压缩操作. 因此,tar.gz的文件可以理解为,先进行打包,再进行压缩. 那么

Java程序员的日常 —— static的用法讲解实践

之前文章说过Java中static的作用,有朋友想看个例子.于是便抽空写了个小栗子 代码 package xing.test.thinking.chap5; class A{ public A() { System.out.println("A constructor"); } } class VarTest{ static A a = new A(); public static int b = 0; public int c = 0; static{ System.out.prin

Java程序员的日常——存储过程知识普及

存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器,之后通过名称调用. 特点 1 提高性能 存储过程是预先编译过,进行优化后,存储在SQL的内存中,使用的时候不需要重新编译,提高工作效率. 2 减少网络流量 存储过程的代码直接存储在数据库中,用户通过名称进行调用,减小网络流量,加快执行速度.如:百万以上的数据查询,存储过程分页要比其他方式的分页快得多

Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统

今天大部分时间都在写业务代码,然后算是从无到有的配置了下spring与mybatis的集成. SpringMVC+Mybatis Web开发流程 配置数据源 在applicationContext.xml中引入数据源的配置: <context:component-scan base-package="com.test" ></context:component-scan> <context:property-placeholder location=&qu

Java程序员的日常 —— 《编程思想》包和访问权限

包的作用 在C++中有命名空间的概念,这是因为,不同的项目或者人写出来的代码,可能名称是一样的.比如,java.util中有List,java.awt中也有List,那么我们在开发中,怎么会知道使用的是哪一个List呢? 在Java中是使用包来管理的,比如你可以这样使用: import java.util.ArrayList; java.util.List list = new ArrayList(); 既可以像第一行那样,使用import引用包:也可以直接在Java代码中指定包的路径.一般来说

Java程序员的日常—— Properties文件的读写

在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Properties. 文件的读取 Properties类提供了Load方法,支持以inputstream为参数,读取配置文件.因此可以这样: Properties props = new Properties(); //如果配置文件放在类目录下,可以直接通过类加载器读取 props.load(new Fi