Java基础知识14--commons-io第3方开源库的具体使用(IOUtils类、FileUtils类、FilenameUtils类)

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 - 计算通过流传递的字节数。

maven依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

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(){
        InputStream is =null;
        OutputStream os=null;
        try {
            is = IOUtils.toInputStream("This is a String", "utf-8");
            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();
        }finally {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }
    }

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<String> 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<String> 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这个方法用于跳f过指定长度的流。

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();
        }
    }

效果图:

 3.FileUtils类

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

public class FileUtils extends Object

3.1 特点 

  • 写入文件的方法。
  • 从文件中读取的方法。
  • 制作包含父目录的目录的方法。
  • 复制文件和目录的方法。
  • 删除文件和目录的方法。
  • 转换为URL的方法和从URL转换的方法。
  • 通过过滤器和扩展名列出文件和目录的方法。
  • 比较文件内容的方法。
  • 提交上次更改日期的方法。
  • 计算校验和的方法。

3.2 常用方法汇总

(1)getFile方法

获取文件对象

public static File getFile(String... names)

(2)getTempDirectory方法

获取临时目录

public static File getTempDirectory()

(3)getTempDirectoryPath方法

获取临时目录路径

public static String getTempDirectoryPath()

(4)getUserDirectory 方法

返回用户主目录

public static File getUserDirectory()

(5) getUserDirectoryPath方法 

返回用户主目录路径

public static String getUserDirectoryPath()

(6) copyFileToDirectory方法 

将指定源文件的内容复制到指定目标目录中的同名文件中。

public static void copyFileToDirectory(File srcFile,File destDir) throws IOException

(7)readFileToString 方法

将文件的内容读入字符串。 该文件始终处于关闭状态。

public static String readFileToString(File file,Charset charsetName) throws IOException

使用案例:

/**
 * @Author lucky
 * @Date 2021/12/13 17:48
 */
public class FileUtilsTest {
    public static void main(String[] args) {
        try {
            //Using FileUtils
            usingFileUtils();
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
    }
    public static void usingFileUtils() throws IOException {
        //01 获取文件对象
        File file = FileUtils.getFile("D:\\data\\1.txt");
        //02 获取临时目录
        File tmpDir = FileUtils.getTempDirectory();
        System.out.println(tmpDir.getName());
        String tempDirectoryPath = FileUtils.getTempDirectoryPath();
        System.out.println(tempDirectoryPath);
        //03 将指定源文件的内容复制到指定目标目录中的同名文件中。
        FileUtils.copyFileToDirectory(file, tmpDir);
        //04 获取文件对象
        File newTempFile = FileUtils.getFile(tmpDir, file.getName());
        //05 获取文件内容
        String data = FileUtils.readFileToString(newTempFile, String.valueOf(Charset.defaultCharset()));
        //06 打印内容
        System.out.println(data);
    }
}

控制台输出:

4.FilenameUtils类

提供在不使用文件对象的情况下处理文件名的方法。 它以类似的方式在不同的操作系统上运行。 这个类解决了从基于Windows的开发机器转移到基于Unix的生产机器时的问题。

public class FilenameUtils extends Object

该类定义文件名中的六个组件。 将示例位置视为C:\dev\project\file.txt 。 然后组件是 -

  • 前缀 - C:\
  • 相对路径 - 开发项目\
  • 绝对路径 - C:\dev\project\
  • 名称 - file.txt
  • 基本名称 - 文件
  • 扩展 - txt

要标识目录,请在文件名中添加分隔符。

使用案例:

    public static void usingFilenameUtils() throws IOException{
        String path = "C:\\dev\\project\\file.txt";
        System.out.println("全路径: " +FilenameUtils.getFullPath(path));
        System.out.println("相对路径: " +FilenameUtils.getPath(path));
        System.out.println("Prefix: " +FilenameUtils.getPrefix(path));
        System.out.println("文件后缀: " + FilenameUtils.getExtension(path));
        System.out.println("文件名称,不包含后缀: " + FilenameUtils.getBaseName(path));
        System.out.println("文件名称,包含后缀: " + FilenameUtils.getName(path));
        String filename = "C:/commons/io/lang/project.xml";
        System.out.println("获取当前系统格式化路径: " + FilenameUtils.normalize(filename));
        System.out.println("移除文件的扩展名:"+FilenameUtils.removeExtension(path));
        System.out.println("转换分隔符为当前系统分隔符:"+FilenameUtils.separatorsToSystem(path));
        System.out.println("转换分隔符为linux系统分隔符:"+FilenameUtils.separatorsToUnix(path));
        System.out.println("转换分隔符为windows系统分隔符:"+FilenameUtils.separatorsToWindows(path));

    }

控制台输出:

参考文献: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

https://blog.csdn.net/qq_19167629/article/details/79501022

posted @ 2021-11-29 19:29  雨后观山色  阅读(1288)  评论(0编辑  收藏  举报