欢迎访问优讯网!
您当前的位置:首页 > 爱编程

java合并多个文件的两种方法

时间:2020-05-20 08:25:42  来源:优讯网  作者:小卡司  浏览次数:
这篇文章主要为大家详细介绍了java合并多个文件的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在java多个线程下载文件或处理较大文件是可能会切分成多个文件,处理完成后需要合并成一个文件。

Java中合并子文件最容易想到的就是利用BufferedStream进行读写。

利用BufferedStream合并多个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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方法进行合并。此方法可以利用很多操作系统直接从文件缓存传输字节的能力来优化传输速度。

实现方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助

来顶一下
返回首页
返回首页

原文链接:https://www.jb51.net/article/186894.htm


推荐资讯
如何下载旧版centos iso镜像 如何下载迷你mini版的centos镜像
如何下载旧版centos i
计算机的正确使用姿势 电脑痴如何正确的使用电脑
计算机的正确使用姿势
好用的后台管理的前端框架模版H-ui H-ui框架模版分享
好用的后台管理的前端
微信电脑多开方法 无需辅助电脑版微信双开方法分享
微信电脑多开方法 无
相关文章
栏目更新
栏目热门