前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小家java】Java之Apache Commons-IO使用精讲(FileUtils、IOUtils、FileFilter全覆盖)

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

作者头像
YourBatman
发布2019-09-03 14:49:39
3.6K0
发布2019-09-03 14:49:39
举报
文章被收录于专栏:BAT的乌托邦BAT的乌托邦

每篇一句

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

概述

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

  1. 工具类——使用静态方法执行共同任务
  2. 输入——用于InputStream和Reader实现
  3. 输出——用于OutputStream和Writer实现
  4. 过滤器——各种文件过滤器实现
  5. 比较器——各种文件的java.util.Comparator实现
  6. 文件监听器——监听文件系统事件的组件
在这里插入图片描述
在这里插入图片描述
工具类
IOUtils

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

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

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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里面的内容(字节流)是否完全相同
代码语言:javascript
复制
    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)

代码语言:javascript
复制
    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:把传入的字节数组,写入到输出流里(可指定编码)

各种常用的常量:

代码语言:javascript
复制
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表示文件路径分隔符

代码语言:javascript
复制
new File("test"+File.separator+"test.txt"); //中file的相对路径就是test下的test.txt
FileUtils

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

代码语言:javascript
复制
    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等等
代码语言:javascript
复制
    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代替
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每篇一句
  • 概述
  • 工具类
    • IOUtils
      • FileUtils
      • FilenameUtils
      • FileSystemUtils:2.6版本已经废弃。推荐使用JDK自己的FileStore代替
      • LineIterator:行迭代器
      • Filefilter:包含IOFileFilter、FilenameFilter等。可以在copy、remove等等操作的时候,对文件进行各种过滤行为
      • 比较器:比如按照文件名倒序、文件大小倒序这种需求,用此比较器会非常方便。也内置了很多的比较器实现
      • org.apache.commons.io.input和org.apache.commons.io.output包含各种有用、实用的流实现。
      • CopyUtils:已经过期,请使用IOUtils代替
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档