java合并多个文件的两种方法
在java多个线程下载文件或处理较大文件是可能会切分成多个文件,处理完成后需要合并成一个文件。
Java中合并子文件最容易想到的就是利用BufferedStream进行读写。
利用BufferedStream合并多个文件
public static boolean mergeFiles(String[] fpaths, String resultPath) {
if (fpaths == null || fpaths.length < 1 || TextUtils.isEmpty(resultPath)) {
return false;
}
if (fpaths.length == 1) {
return new File(fpaths[0]).renameTo(new File(resultPath));
}
File[] files = new File[fpaths.length];
for (int i = 0; i < fpaths.length; i ++) {
files[i] = new File(fpaths[i]);
if (TextUtils.isEmpty(fpaths[i]) || !files[i].exists() || !files[i].isFile()) {
return false;
}
}
File resultFile = new File(resultPath);
try {
int bufSize = 1024;
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(resultFile));
byte[] buffer = new byte[bufSize];
for (int i = 0; i < fpaths.length; i ++) {
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(files[i]));
int readcount;
while ((readcount = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, readcount);
}
inputStream.close();
}
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
for (int i = 0; i < fpaths.length; i ++) {
files[i].delete();
}
return true;
}
利用nio FileChannel合并多个文件
BufferedStream的合并操作是一个循环读取子文件内容然后复制写入最终文件的过程,此过程会从文件系统中读取数据到内存中,之后再写入文件系统,比较低效。
一种更高效的合并方式是利用Java nio库中FileChannel类的transferTo方法进行合并。此方法可以利用很多操作系统直接从文件缓存传输字节的能力来优化传输速度。
实现方法:
public static boolean mergeFiles(String[] fpaths, String resultPath) {
if (fpaths == null || fpaths.length < 1 || TextUtils.isEmpty(resultPath)) {
return false;
}
if (fpaths.length == 1) {
return new File(fpaths[0]).renameTo(new File(resultPath));
}
File[] files = new File[fpaths.length];
for (int i = 0; i < fpaths.length; i ++) {
files[i] = new File(fpaths[i]);
if (TextUtils.isEmpty(fpaths[i]) || !files[i].exists() || !files[i].isFile()) {
return false;
}
}
File resultFile = new File(resultPath);
try {
FileChannel resultFileChannel = new FileOutputStream(resultFile, true).getChannel();
for (int i = 0; i < fpaths.length; i ++) {
FileChannel blk = new FileInputStream(files[i]).getChannel();
resultFileChannel.transferFrom(blk, resultFileChannel.size(), blk.size());
blk.close();
}
resultFileChannel.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
for (int i = 0; i < fpaths.length; i ++) {
files[i].delete();
}
return true;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
MyBatis创建存储过程的实例代码_动力节点Java学院整理
本节需要用到的有2部分,第一部分是如何在Derby中创建存储过程,第二部分是如何在Mybatis中调用存储过程,具体实例代码大家参考下本文吧2017-09-09
Java使用wait() notify()方法操作共享资源详解
这篇文章主要为大家详细介绍了Java使用wait() notify()方法操作共享资源,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-10-10
Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)
这篇文章主要介绍了分布式系统开发经验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04
Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解
这篇文章主要介绍了Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码,通过开发实践,理解过滤器和拦截器的工作原理,需要的朋友可以参考下2018-06-06


最新评论