파일 이동하기, 확장자 바꾸기, 압축하기, 압축 해제하기

회사에서 요구사항을 다루던 도중 원본 파일을 복사 하여 zip으로 바꿔 저장 하고
바꾼 zip 파일을 풀면 내용물을 이용하여 이런저런 작업을 하는 일이 생겼다.
소스가 이해하기 어렵지 않을 거라고 판단되어 간단하게 주석으로 달아놓았다. 내 블로그 어차피 나밖에 안보잖아..

- 파일 복사후 zip파일 만들기

@Test
public void rename() {
  File originFile = new File(workspace + fileName + ".odt");
  File renameCopyFile = new File(workspace + fileName +".zip");
  try {
    // import org.apache.commons.io.FileUtils;
    FileUtils.copyFile(originFile, renameCopyFile);
    log.debug("확장자 바꿨어? : {}", renameCopyFile.exists());
    if(renameCopyFile.exists()) log.debug("뭘로 바꿨는데? : {}", renameCopyFile.getName());
  } catch (IOException e) {
    e.printStackTrace();
  }
}

- 압축 해제하기

@Test
public void unzip() {
  // zip 파일
  File zipFile = new File(workspace + "test.zip");
  log.debug("zipFile.exist : {}", zipFile.exists());
  // 압축해제 경로
  File unzipFolder = new File(zipFile.getParent(), zipFile.getName().replace(".zip", ""));
  log.debug("unzipFolder : {}", unzipFolder.getAbsolutePath() + "\n");
  // 존재 하지 않으면 디렉토리 만들기
  if(unzipFolder.exists() == false) unzipFolder.mkdirs();
  log.debug("############# unzip begin #############");
  try (
    // zip 파일 읽어오기
    FileInputStream fis = new FileInputStream(zipFile);
    ZipInputStream zis = new ZipInputStream(fis);
    BufferedInputStream bis = new BufferedInputStream(zis);
  ) {
    ZipEntry zipEntry = null;
    while ((zipEntry = zis.getNextEntry()) != null) {
      File f = new File(unzipFolder.getAbsolutePath(), zipEntry.getName());
      if (zipEntry.isDirectory()) { // entry가 디렉토리일 경우 생성
        log.debug("── onlyDirectory : {}", zipEntry.getName());
        log.debug("└── mkdirs :{}", f.mkdirs());
      } else {
        log.debug("── fileName : {}", zipEntry.getName());
        if (f.getParentFile().exists() == false) { // entry의 부모 디렉토리가 없을 경우
          log.debug("└── makeParentDirectory : {}", zipEntry.getName().substring(0, zipEntry.getName().lastIndexOf("/")));
          f.getParentFile().mkdirs();
        }
        try (
          FileOutputStream fos = new FileOutputStream(f);
          BufferedOutputStream bos = new BufferedOutputStream(fos);
        ) {
          int b = 0;
          while ((b = bis.read()) != -1) {
            bos.flush();
            bos.write(b);
          }
        }
      }
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
}

- 혹시나 필요할까 만들어본 여러 파일 압축하기

  @Test
  // 한가지 파일을 압축하는것과 여러 파일을 압축하는건
  // for문 돌리고 안돌리고 차이
  public void zip(){
    // 작업 폴더안에 test라는 이름의 파일을 조회하기
    File folder = new File(workspace);
    FileFilter ff = new WildcardFileFilter("test.*");
    File[] list = folder.listFiles(ff);
    // 조회된 파일 리스트에서 파일 하나하나 ZipOutputStream에 써줌
    if(list != null){
      // 쓸 파일
      File zipFile = new File(workspace + "내가압축파일만들었다!!!!.zip");
      try(
        FileOutputStream fos = new FileOutputStream(zipFile);
        ZipOutputStream zos = new ZipOutputStream(fos);
        ){
        // 읽을 파일
        for (File file : list) {
          log.debug("압축 대상 파일명 : {}", file.getName());
          try(
            FileInputStream fis = new FileInputStream(file);
          ){
            // 압축할 요소
            ZipEntry ze = new ZipEntry(file.getName());
            zos.putNextEntry(ze);
            // 쓰기
            int b = 0;
            while((b = fis.read()) != -1){
              zos.write(b);
              zos.flush();
            }
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }}

+ Recent posts