最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java合并多個文件的兩種方法

 更新時間:2020年05月19日 15:14:45   作者:doc_zlw  
這篇文章主要為大家詳細介紹了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的合并操作是一個循環(huán)讀取子文件內容然后復制寫入最終文件的過程,此過程會從文件系統(tǒng)中讀取數(shù)據(jù)到內存中,之后再寫入文件系統(tǒng),比較低效。

一種更高效的合并方式是利用Java nio庫中FileChannel類的transferTo方法進行合并。此方法可以利用很多操作系統(tǒng)直接從文件緩存?zhèn)鬏斪止?jié)的能力來優(yōu)化傳輸速度。

實現(xiàn)方法:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

莲花县| 拉孜县| 乌兰县| 永和县| 玉树县| 克东县| 屯昌县| 太谷县| 富顺县| 康乐县| 崇信县| 工布江达县| 南陵县| 瑞昌市| 密山市| 定安县| 广河县| 武平县| 马边| 邛崃市| 抚顺县| 毕节市| 外汇| 台南市| 荣成市| 西和县| 嘉鱼县| 竹北市| 霍林郭勒市| 同心县| 平果县| 铜鼓县| 安义县| 阿拉善右旗| 师宗县| 封开县| 塔河县| 吕梁市| 阜平县| 上高县| 清流县|