相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


每篇一句

总是有人要赢的,而为什么不是你,所以我们必须要努力

概述

Commons IO是针对开发IO流功能的工具类库。
主要包括六个区域:

  1. 工具类——使用静态方法执行共同任务
  2. 输入——用于InputStream和Reader实现
  3. 输出——用于OutputStream和Writer实现
  4. 过滤器——各种文件过滤器实现
  5. 比较器——各种文件的java.util.Comparator实现
  6. 文件监听器——监听文件系统事件的组件
    【小家java】Java之Apache Commons-IO使用精讲(FileUtils、IOUtils、FileFilter全覆盖)_FileUtils

工具类

IOUtils

该工具类可能是平时使用得最多的工具类了。
IOUtils包含处理读、写和复制的工具方法。方法对InputStream、OutputStream、Reader和Writer起作用。

例如,从一个URL读取字节的任务,并且打印它们:

    public static void main(String[] args) throws Exception {
        //从网络上读取一个网页资源
        InputStream in = new URL("http://commons.apache.org").openStream();
        try {
            InputStreamReader inR = new InputStreamReader(in);
            BufferedReader buf = new BufferedReader(inR);
            String line;
            while ((line = buf.readLine()) != null) {
                System.out.println(line);
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
结果:
控制台打印出了这个网页的所有内容

使用IOUtils:

    public static void main(String[] args) throws Exception {
        //从网络上读取一个网页资源
        try (InputStream in = new URL("http://commons.apache.org").openStream()) {
            System.out.println(IOUtils.toString(in, StandardCharsets.UTF_8));
        }
        //finally {
        //    IOUtils.closeQuietly(in);
        //}
    }

在某些应用领域,这些IO操作是常见的,而这个类可以节省大量的时间。你可以依靠经过良好测试的代码。这样的实用程序代码,灵活性和速度是最重要的。

使用上述技术读取一个1 gb文件将导致试图创建一个1 gb的字符串对象! 因此你的流里问价非常非常的打,建议不要这么做,分布处理吧

主要方式介绍:

  • buffer:一句话可以吧inputStream、outputStream、Reader、Witter等包装成带缓冲区的流,提高效率
  • closeQuietly:可以关闭各种流、socket等任何closeable的实例(不过官方推荐使用try-with-resources来代替)
  • contentEquals:比较两个InputStream或者两个Reader里面的内容(字节流)是否完全相同
    public static void main(String[] args) throws Exception {
        try (InputStream in1 = new URL("http://commons.apache.org").openStream(); InputStream in2 = new URL("http://commons.apache.org").openStream()) {
            System.out.println(in1.equals(in2)); //false
            System.out.println(IOUtils.contentEquals(in1, in2)); //true
        }
    }

备注:contentEqualsIgnoreEOL(final Reader input1, final Reader input2) 该方法会忽略ignoring EOL characters

  • copy:流的互相拷贝。可以将输入流拷到输出流。copy(final InputStream input, final OutputStream output, final int bufferSize),Reader拷贝到Writer等等
  • copyLarge:当你的流拷贝的是大文件(一般大于2G级别),请使用此方法拷贝
  • lineIterator:BufferedReader 通常在只有读到空格或者换行符时才会结束读取,攻击者很容易构内存攻击导致系统瘫痪,出于安全考虑这里推荐使用io包的LineIterator,并且其在性能上也优于普通流。

lineIterator(final InputStream input, final Charset encoding)
lineIterator(final InputStream input, final String encoding)
lineIterator(final Reader reader)

    public static void main(String[] args) throws Exception {
        try (InputStream in1 = new URL("http://commons.apache.org").openStream()) {
            LineIterator lineIterator = IOUtils.lineIterator(in1, StandardCharsets.UTF_8);
            while (lineIterator.hasNext()) {
                lineIterator.nextLine();
            }
            lineIterator.close();
        }
    }
  • read、readFully:把输入流的东西读取添加到第二个参数中的字节数组里
  • readLines:不解释
  • resourceToByteArray、resourceToString:直接传入一个文件的路径,读取进来
  • toBufferedInputStream:把普通的inputStream转换成带缓冲区的,返回一个新的InputStream
  • toByteArray:吧输入流转换到字节数组
  • toCharArray:
  • toInputStream:吧字符、字符串等等直接读到流里
  • toString:强大的方法,可以吧各种输出流读成一个串
  • write、writeChunked、writeLines:把传入的字节数组,写入到输出流里(可指定编码)

各种常用的常量:

public static final char DIR_SEPARATOR_UNIX = '/';
public static final char DIR_SEPARATOR_WINDOWS = '\\';
/**
    * The system directory separator character.  系统文件夹的分隔符 通用的
    */
   public static final char DIR_SEPARATOR = File.separatorChar;
    /**
    * The Unix line separator string.  换行符
    */
   public static final String LINE_SEPARATOR_UNIX = "\n";
   //winows换行符
   public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
    /**
    * The system line separator string.  通用的换行符
    */
   public static final String LINE_SEPARATOR;

一般可以认为是"/“的作用等同于”\"
在java中路径一般用"/",在java中路径一般用"/",linux、unix中的路径一般用"/",所以在java中写windows路径一般用"/“或将”“转义一下,就成了”\",最好用“/”,因为java是跨平台的。

“\”(在java代码里应该是\)是windows环境下的路径分隔符,Linux和Unix下都是用“/” 而在windows下也能识别“/”。所以最好用“/”

为了提高代码的跨平台可移植性对于文件路径分隔符也可以使用File.separator表示文件路径分隔符

new File("test"+File.separator+"test.txt"); //中file的相对路径就是test下的test.txt
FileUtils

FileUtils类包含使用File对象的工具方法。包括读写、复制和比较等等。

    public static void main(String[] args) throws IOException {
       File file = new File("/application.properties");
       List<String> lines = FileUtils.readLines(file, "UTF-8");

       System.out.println(lines);
   }
  • byteCountToDisplaySize:挺人性化的一个方法,可以吧字节数组的长度,转化成用户良好的单位,如EB、GB、MB、KB、bytes等等
    public static void main(String[] args) throws Exception {
        try (InputStream in1 = new URL("http://commons.apache.org").openStream()) {
            String s = FileUtils.byteCountToDisplaySize(IOUtils.toByteArray(in1).length);
            System.out.println(s); //26 KB
        }
    }
  • checksum、checksumCRC32:类似于校验MD5和。如long csum = FileUtils.checksum(file, new CRC32()).getValue();,一般下载来一个文件后,为了安全可以校验一把
  • cleanDirectory:把指定文件夹里面的东西全部删除掉
  • contentEquals:依赖于IOUtils.contentEquals
  • convertFileCollectionToFileArray:把File的集合转换为File的数组
  • copyDirectory(srcDir,destDir,FileFilter):吧src的文件夹内容copy(或者剪切)到dest里面,可以使用FileFilter过滤
  • copyFile:可以一个文件copy到另外一个文件,也可以copy到outputStream里面。
  • copyFileToDirectory:
  • copyInputStreamToFile:
  • copyURLToFile:
  • deleteDirectory:递归删除这个文件夹里面的所有东西(包括文件夹自己)
  • deleteQuietly:既可以删除文件,也可以递归删除文件夹
  • directoryContains:指定文件夹下是否包含某个文件
  • forceDelete:强制删除一个文件。如果是文件夹,也会递归删除掉。
  • forceMkdir:强制创建一个目录
  • getTempDirectoryPath:拿到IO的临时文件夹路径
  • isFileNewer、isFileOlder:判断该文件的最后修改时间,是否新于给定的Date时间(或者给定文件的lastModified)
  • listFiles、listFilesAndDirs:拿到指定文件夹下所有的文件
  • moveDirectory、moveFile
  • openInputStream:效果同new FileInputStream
  • openOutputStream:同上
  • readFileToByteArray、readFileToString、readLines
  • sizeOf、sizeOfAsBigInteger、:拿到文件/文件夹的大小
  • sizeOfDirectory、sizeOfDirectoryAsBigInteger
  • toFile(URL url):吧网络上的资源字节编程一个文件
  • write、writeByteArrayToFile、writeLines、writeStringToFile:把传入的data串写入到File里面

FilenameUtils

FilenameUtils类包含工具方法不需要使用File对象就可以操作文件名。该类致力于屏蔽Unix和Windows之间的不同,避免这些环境之间的转换(例如,从开发到生产)。 开发在windows、生产在Linux

一般使用较少,这里不做过多介绍.

FileSystemUtils:2.6版本已经废弃。推荐使用JDK自己的FileStore代替

LineIterator:行迭代器

提供灵活的方式使用一个基于行的文件。可以直接,或通过FileUtils或IOUtils的工厂方法创建实例。推荐使用模式:

备注:也是需要close的

Filefilter:包含IOFileFilter、FilenameFilter等。可以在copy、remove等等操作的时候,对文件进行各种过滤行为

此包自带一些常用的Filter如:AgeFileFilter、CanReadFileFilter、CanWriteFileFilter、DirectoryFileFilter、EmptyFileFilter、HiddenFileFilter等等。基本能满足我们所有需求

比较器:比如按照文件名倒序、文件大小倒序这种需求,用此比较器会非常方便。也内置了很多的比较器实现

如:SizeFileComparator、ReverseComparator、LastModifiedFileComparator、ExtensionFileComparator等等

org.apache.commons.io.input和org.apache.commons.io.output包含各种有用、实用的流实现。

  1. 空输出流——默默的吸收、消化发给它的所有数据。
  2. 计算流——统计传递的字节数。(CountingInputStream、CountingOutputStream,这个挺好用的)
  3. 代理流——委托恰当的方法代理。

CopyUtils:已经过期,请使用IOUtils代替


 

【小家java】Java之Apache Commons-IO使用精讲(FileUtils、IOUtils、FileFilter全覆盖)_享学Java_02