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

java合并多個(gè)文件的兩種方法

 更新時(shí)間:2020年05月19日 15:14:45   作者:doc_zlw  
這篇文章主要為大家詳細(xì)介紹了java合并多個(gè)文件的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在java多個(gè)線程下載文件或處理較大文件是可能會(huì)切分成多個(gè)文件,處理完成后需要合并成一個(gè)文件。

Java中合并子文件最容易想到的就是利用BufferedStream進(jìn)行讀寫(xiě)。

利用BufferedStream合并多個(gè)文件

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合并多個(gè)文件

BufferedStream的合并操作是一個(gè)循環(huán)讀取子文件內(nèi)容然后復(fù)制寫(xiě)入最終文件的過(guò)程,此過(guò)程會(huì)從文件系統(tǒng)中讀取數(shù)據(jù)到內(nèi)存中,之后再寫(xiě)入文件系統(tǒng),比較低效。

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

實(shí)現(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;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

水城县| 安庆市| 海口市| 福州市| 沙雅县| 天祝| 藁城市| 沧州市| 昔阳县| 紫云| 花莲市| 额尔古纳市| 深泽县| 克什克腾旗| 大洼县| 朝阳区| 望都县| 游戏| 建水县| 宁强县| 昭通市| 凯里市| 呼玛县| 景宁| 迁西县| 北海市| 南汇区| 区。| 祁东县| 鹿泉市| 郑州市| 安塞县| 遂川县| 城固县| 明水县| 长沙县| 昌吉市| 渑池县| 云阳县| 河间市| 吕梁市|