자바 여러 파일 을 합 치 는 두 가지 방법

3641 단어 자바병합 파일
자바 여러 스 레 드 에서 파일 을 다운로드 하거나 큰 파일 을 처리 하 는 것 은 여러 파일 로 나 눌 수 있 습 니 다.처리 가 완료 되면 하나의 파일 로 합 쳐 야 합 니 다.
자바 에서 하위 파일 을 통합 하 는 것 이 가장 생각 나 는 것 은 버 프 레 드 스 트림 을 이용 하여 읽 기와 쓰 기 를 하 는 것 이다.
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 의 통합 작업 은 하위 파일 내용 을 반복 적 으로 읽 고 최종 파일 을 복사 하 는 과정 입 니 다.이 과정 은 파일 시스템 에서 데 이 터 를 메모리 로 읽 은 다음 파일 시스템 에 기록 하 는 것 으로 비효 율 적 입 니 다.
더 효율 적 인 합병 방식 은 자바 니 오 라 이브 러 리 의 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;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기