使用apache 的FileUtils处理文件的复制等操作方式

 更新时间:2021年07月23日 12:09:04   作者:傻不拉几猫  
这篇文章主要介绍了使用apache 的FileUtils处理文件的复制等操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

平时对一些文件进行操作,比如说写文件,读文件,复制一个文件等,使用原生File操作需要读取源文件,生成流对象,再写入一个新的文件中一系列过程,使用apache commons-io帮我们封装了这些实现,有些操作可以很容易的使用它的api来实现。

这里使用2.6版本,javadoc参照commons-io-2.6

1、pom依赖加入commons-io

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

2、常用API使用

2.1 获取文件

File fileA = FileUtils.getFile(testPath + "a.txt");
// 最终路径为入参拼接起来即testPath + "a.txt"
File fileAA = FileUtils.getFile(testPath, "a.txt");
// 获取某个目录下的文件,后面参数是拼接而成的
File fileAAA = FileUtils.getFile(new File(testPath), "a.txt");

2.2 获取临时目录和用户目录

// 获取临时目录路径
// 每种操作系统有所不同,Windows一般是C:\DOCUME~1\用户~1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp
// Windows的java.io.tmpdir属性值可以看环境变量->用户变量中的TMP。
File tempDirectory = FileUtils.getTempDirectory();
String tempDirectoryPath = FileUtils.getTempDirectoryPath();
File userDirectory = FileUtils.getUserDirectory();
String userDirectoryPath = FileUtils.getUserDirectoryPath();
System.out.println(tempDirectoryPath + "  -  " + tempDirectory);
System.out.println(userDirectoryPath + "  -  " + userDirectory.getName());

2.3 创建文件

// 创建文件(实现与Unix上“ touch”实用程序相同的行为。它会创建一个大小为0的新文件,或者如果文件已经存在,则将其打开和关闭而不进行修改,而是更新文件的日期和时间。)
File fileD = new File(testPath + "d.txt");
FileUtils.touch(fileD);

2.4 写内容到文件

// 写文件
File fileB = new File(testPath + "b.txt");
if (!fileB.exists()) {
    fileB.createNewFile();
}
// 通过字节写入文件
FileUtils.writeByteArrayToFile(fileB, "Hello, smile".getBytes());
FileUtils.writeByteArrayToFile(fileB, "Hello, sunshine".getBytes(), true);
// 通过行写入文件(覆盖)
FileUtils.writeLines(fileB, Lists.newArrayList("春夏秋冬, 三餐四季,只愿有你"));
// 通过行写入文件(追加)
FileUtils.writeLines(fileB, Lists.newArrayList("春风很柔,夏风很烈,秋风清爽,东风凛冽,你就是春夏秋冬的风"), true);
// 字符串写入,不换行追加
FileUtils.writeStringToFile(fileB, "唯美有你", "UTF-8", true);
FileUtils.writeStringToFile(fileB, "哪里有你", Charset.defaultCharset(), true);
File fileC = new File(testPath + "c.txt");
if (!fileC.exists()) {
    fileC.createNewFile();
}
//  流操作
fileInputStream   = FileUtils.openInputStream(fileB);
//  fileOutputStream = FileUtils.openOutputStream(fileC);
fileOutputStream = FileUtils.openOutputStream(fileC, true);
// 字节数组
byte[] buffer = new byte[1024];
// 将文件内容写到文件中
while (fileInputStream.read(buffer) != -1) {
    fileOutputStream.write(buffer);
}

2.5 读取文件内容

// 按行读取文件内容
List list = FileUtils.readLines(fileAAA, "UTF-8");
System.out.println(list.size() > 0 ? list.get(0) : "" + list.size());
List<String> lines = FileUtils.readLines(fileB, Charset.defaultCharset());
System.out.println(lines.size() > 0 ? lines.get(0) : "" + lines.size());
// 读取文件内容为字节
byte[] bytes = FileUtils.readFileToByteArray(fileB);
System.out.println(new String(bytes));
// 读取文件为String
String fileToString = FileUtils.readFileToString(fileB, "UTF-8");
System.out.println(fileToString);
String fileToString2 = FileUtils.readFileToString(fileB, Charset.defaultCharset());
System.out.println(fileToString2);

2.6 获取目录文件及目录

// recursive是否递归查询,这里查询.txt文件,也可以指定其他格式的,如果extensions为null则查询所有类型的文件
Collection<File> listFiles = FileUtils.listFiles(new File(testPath), null, true);
Collection<File> listFiles2 = FileUtils.listFiles(new File(testPath), new String[]{"txt"}, true);
// 获取某个目录下的所有文件 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files1 = FileUtils.listFiles(new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
// 获取某个目录下的所有文件和文件目录 TrueFileFilter.INSTANCE表示匹配所有的
Collection<File> files2 = FileUtils.listFilesAndDirs(new File(testPath), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);

2.7 文件内容比较

// 文件内容比较
boolean aa = FileUtils.contentEquals(fileA, fileAA);
boolean ab = FileUtils.contentEquals(fileA, fileB);

2.8 文件或目录拷贝

// 文件复制,将文件A的内容复制给文件D
FileUtils.copyFile(fileA, fileD);
// 把文件复制到某个目录下
FileUtils.copyFileToDirectory(fileD, new File(testPath + "inner"));
// 把某个目录拷贝到另外一个目录
FileUtils.copyDirectoryToDirectory(new File(testPath + "inner"), new File(testPath + "other"));
// 把文件或目录拷贝到指定目录
FileUtils.copyToDirectory(fileB, new File(testPath + "inner"));
// 文件目录复制
FileUtils.copyDirectory(new File(testPath + "inner"), new File(testPath + "first"));

2.9 文件或目录删除

// 删除目录
FileUtils.deleteDirectory(new File(testPath + "first"));
// 删除文件或目录
FileUtils.deleteQuietly(fileD);
FileUtils.deleteQuietly(new File(testPath + "first"));

这就是FileUtils工具类的一些常用操作API使用。

Github源码参照

apache commons-io的FileUtils.copyFile简单地复制文件

一般的方法,我们要复制一个文件,可能需要读取源文件,生成流对象,再写入一个新的文件中,使用apache commons-io很容就可以处理文件的复制。

下面的例子演示我们怎样使用FileUtils.copyFile方法在同一个文件夹复制文件和使用FileUtils.copyFileToDirectory方法复制到指定的文件夹中。其中System.getProperty("java.io.tmpdir")为通过JVM读取java.io.tmpdir属性取得临时文件夹,每种操作系统有所不同,Windows一般是C:\DOCUME~1\用户~1\LOCALS~1\Temp,Solaris一般是:/var/tmp/,Linux和Mac OS X一般是:/tmp,Windows的java.io.tmpdir属性值可以看环境变量->用户变量中的TMP。

当然我们一般使用的是绝对或相对路径,如要复制到F:\ajava目录中,我们只需将targetDir改成File targetDir = new File("F:\\ajava");运行后就可以看到结果。

package ajava.sample.apache;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
public class AjavaFileCopyExample {
       public static void main(String[] args)
       {
               // 源File对象
               File source = new File("ajava.txt");
             
               // 备份的File对象
               File target = new File("ajava-backup.txt");
             
               //通过JVM读取java.io.tmpdir属性取得临时文件夹
               File targetDir = new File(System.getProperty("java.io.tmpdir"));
             
               try
               {
                       //在同一个文件夹复制文件
                       System.out.println("复制 " + source + " 文件到 " + target);
                       FileUtils.copyFile(source, target);
                     
                       // 根据指定的文件夹复制
                       System.out.println("复制 " + source + " 文件到" + targetDir + "目录");
                       FileUtils.copyFileToDirectory(source, targetDir);
               } catch (IOException e)
               {
                       // Errors will be reported here if any error occures during copying
                       // the file
                       e.printStackTrace();
               }
       }
}

输出结果为:

复制 ajava.txt 文件到 ajava-backup.txt

复制 ajava.txt 文件到C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp目录

再查看对应的文件夹,就可以发现备份文件。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java类初始化顺序详解

    Java类初始化顺序详解

    这篇文章主要介绍了Java类初始化顺序详解,java语言在使用过程中最先开始就是初始化,在工作中如果遇到什么问题需 要定位往往到最后也可能是初始化的问题,因此掌握初始化的顺序很重要,需要的朋友可以参考下
    2023-08-08
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题

    解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题

    这篇文章主要介绍了解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • springBoot整合redis做缓存具体操作步骤

    springBoot整合redis做缓存具体操作步骤

    缓存主要是将数据存在计算机的内存当中,以便于在使用的时候是可以实现快速读取使用,它的快也是相对于硬盘读取而言,这篇文章主要给大家介绍了关于springBoot整合redis做缓存的具体操作步骤,需要的朋友可以参考下
    2024-04-04
  • JavaCV摄像头实战之实现口罩检测

    JavaCV摄像头实战之实现口罩检测

    这篇文章主要介绍了利用JavaCV实现口罩检测,功能是检测摄像头内的人是否带了口罩,把检测结果实时标注在预览窗口。感兴趣的可以试一试
    2022-01-01
  • 关于bootstrap.yml和bootstrap.properties的优先级问题

    关于bootstrap.yml和bootstrap.properties的优先级问题

    这篇文章主要介绍了关于bootstrap.yml和bootstrap.properties的优先级问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot集成P6spy实现自定义SQL日志打印

    SpringBoot集成P6spy实现自定义SQL日志打印

    本文主要介绍了SpringBoot集成P6spy实现自定义SQL日志打印,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    当运行一个Spring Boot项目时,如果未设置JVM内存参数,Spring Boot默认会采用JVM自身默认的配置策略,接下来通过本文给大家介绍Docker环境下Spring Boot应用内存飙升分析与解决方法,需要的朋友参考下吧
    2021-08-08
  • 在项目中集成jetty server步骤解析

    在项目中集成jetty server步骤解析

    这篇文章主要介绍了在项目中集成jetty server步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 详谈Java中的事件监听机制

    详谈Java中的事件监听机制

    下面小编就为大家带来一篇详谈Java中的事件监听机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Kafka中使用Avro序列化和反序列化详解

    Kafka中使用Avro序列化和反序列化详解

    这篇文章主要介绍了Kafka中使用Avro序列化和反序列化详解,由于Kafka中的数据都是字节数组,在将消息发送到Kafka之前需要先将数据序列化为字节数组, 序列化器的作用就是用于序列化要发送的消息的,需要的朋友可以参考下
    2023-12-12

最新评论