Java基础知识14--commons-io具体使用


1.commons-io概述

Apache Commons IO是由Apache Foundation创建和维护的Java库。 它提供了许多类,使开发人员可以轻松地完成常见任务并且减少样板代码。

commons-io是一款处理io流的工具库,封装了很多处理io流和文件的方法,可以大大简化我们处理io流和操作文件的代码.

 Apache Commons IO库提供以下类别的类:

  • Utility classes - org.apache.commons.io包下的这些类提供文件和字符串比较。 以下是一些例子。

    • IOUtils - 提供用于读取,写入和复制文件的实用程序方法。 这些方法适用于InputStream,OutputStream,Reader和Writer。

    • FilenameUtils - 提供在不使用文件对象的情况下处理文件名的方法。 它以类似的方式在不同的操作系统上运行。

    • FileUtils - 提供操作文件的方法,如移动,打开,检查存在,读取文件等。这些方法使用文件对象。

    • IOCase - 提供字符串操作和比较的方法。

    • FileSystemUtils - 提供获取磁盘驱动器上的可用空间的方法。

    • LineIterator - 提供使用基于行的文件的灵活方式。

  • Filter classes - org.apache.commons.io.filefilter包下的过滤器类提供了基于逻辑标准而不是基于字符串的繁琐比较来过滤文件的方法。 以下是一些例子。

    • NameFileFilter - 过滤名称的文件名。

    • WildcardFileFilter - 使用提供的通配符过滤文件。

    • SuffixFileFilter - 根据后缀过滤文件。 这用于检索特定类型的所有文件。

    • PrefixFileFilter - 根据前缀过滤文件。

  • File Monitor classes - org.apache.commons.io.monitor包下的文件监视器类提供控制以跟踪特定文件或文件夹中的更改,并允许相应地对更改执行操作。 以下是一些例子。

    • FileEntry - 提供文件或目录的状态,某个时间点的文件属性。

    • FileAlterationObserver - 表示根目录下的文件状态,检查文件系统并通知侦听器创建,更改或删除事件。

    • FileAlterationMonitor - 表示生成监视线程的线程,该线程以指定的时间间隔触发任何已注册的FileAlterationObserver。

  • Comparator classes - org.apache.commons.io.comparator包下的文件监视器类允许轻松地比较和排序文件和目录。

    • NameFileComparator - 比较两个文件的名称。

    • SizeFileComparator - 比较两个文件的大小。

    • LastModifiedFileComparator - 比较两个文件的最后修改日期。

  • Stream classes - 在org.apache.commons.io.input包下有多个InputStream实现,在org.apache.commons.io.input包下有OutputStream,可以在流上执行有用的任务。 以下是一些例子。

    • TeeOutputStream - 将输出发送到两个流。

    • ByteArrayOutputStream - 更快的JDK类版本。

    • CountingOutputStream - 计算通过流传递的字节数。

    • CountingOutputStream - 计算通过流传递的字节数。

2.IOUtils

提供用于读取,写入和复制文件的实用方法。 这些方法适用于InputStream,OutputStream,Reader和Writer。

public class IOUtils extends Object

常用方法总结如下:

2.1 toInputStream

public static InputStream toInputStream(String input,String charsetName)

将指定的字符串转换为输入流,使用指定的字符编码将其编码为字节。

使用案例:

InputStream is = IOUtils.toInputStream("This is a String", "utf-8");

2.2 copy方法

这个方法可以拷贝流,算是这个工具类中使用最多的方法了。支持多种数据间的拷贝:

copy(inputstream,outputstream)
copy(inputstream,writer)
copy(inputstream,writer,encoding)
copy(reader,outputstream)
copy(reader,writer)
copy(reader,writer,encoding)

使用案例:将内容按字节从一个InputStream对象复制到一个OutputStream对象,并返回复制的字节数。

    public static void copyFileTest(){
        try {
            InputStream is = IOUtils.toInputStream("This is a String", "utf-8");
            OutputStream os = new FileOutputStream("D:\\data\\3.txt");
            //将字节从 InputStream 复制到 OutputStream。实现文件的拷贝
            int bytes = IOUtils.copy(is, os);
            System.out.println("File Written with " + bytes + " bytes");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.3 readLines

readLines方法可以从流中读取内容,并转换为String的list

readLines(inputstream)
readLines(inputstream,charset)
readLines(inputstream,encoding)
readLines(reader)

使用案例:

    public static void readLinesTest(){
        try{
            InputStream is = new FileInputStream("D:\\data\\3.txt");
            List lines = IOUtils.readLines(is);
            for(String line : lines){
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果图:

 

 2.4 writeLines

writeLines这个方法可以把string的List写入到输出流中

writeLines(Collection<?> lines, String lineEnding, OutputStream output)
writeLines(Collection<?> lines, String lineEnding, OutputStream output, Charset encoding)
writeLines(Collection<?> lines, String lineEnding, OutputStream output, String encoding)
writeLines(Collection<?> lines, String lineEnding, Writer writer)

使用案例:

    public static void writeLinesTest()  {
        try {
            List lines = new ArrayList();
            lines.add("hello");
            lines.add("list");
            lines.add("to");
            lines.add("file");
            OutputStream os = new FileOutputStream("D:\\data\\3.txt");
            IOUtils.writeLines(lines,IOUtils.LINE_SEPARATOR,os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果图:

 2.5 skip

skip这个方法用于跳过指定长度的流。

skip(inputstream,skip_length)
skip(ReadableByteChannel,skip_length)
skip(reader,skip_length)

使用案例:

    public static void skipTest(){
        InputStream is = IOUtils.toInputStream("hello world");
        try {
            IOUtils.skip(is,4);
            System.out.println(IOUtils.toString(is,"utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果图:

 

参考文献:https://iowiki.com/commons_io/commons_io_ioutils.html

http://commons.apache.org/proper/commons-io/apidocs/index.html-----API文档

https://blog.csdn.net/l2580258/article/details/89227761

https://www.cnblogs.com/xing901022/p/5978989.html