자바에서 사용 할 수 있는 ZIP 라이브러리 중에 실제 파일을 생성하지 않고 핸들링 할 수 있는 라이브러리가 있을까요?

조회수 848회

스프링부트로 코드를 작성하였습니다.

리소스로부터 몇개의 디렉토리를 가져다가 zip으로 압축하여 다운로드 할 수 있는 기능입니다.

현재 zip4j 라이브러리를 사용하여 개발되었습니다.

File.createTempFile("test_", ".zip");
String tempFilePath = createTempFile.getAbsolutePath();
createTempFile.delete(); // 다양한 OS에서 각기 다른 임시파일 경로만 취하기 위해 생성 후 삭제
ZipFile zipFile = new ZipFile(createTempFile);
... 중략 ...
FileInputStream fileInputStream = new FileInputStream(zipFile.getFile());
byte[] binaryData = IOUtils.toByteArray(fileInputStream);
fileInputStream.close();
new File(tempFilePath).delete();

위와 같이 Zip파일을 생성(정확히는 각 OS에 맞는 tmp경로에 임시파일을 생성하여 임시파일 경로를 취한 후 삭제하고 zip4j에게 맡김)하여 addStream 메소드를 이용하여 zip파일을 내려보냅니다. 그 이후 zip파일은 삭제하고 있습니다.

아마도 zip4j 에서 ZipFile 객체를 생성할 때 생성자에서 내부적으로 파일을 실제로 생성하는 것이 아닐까 추측합니다. 왜냐하면 createTempFile.delete(); 메소드를 호출하지 않으면, 익셉션이 발생합니다.

zip4j 라이브러리가 사용 편의성 면에서 매우 훌륭하지만, 임시파일을 생성하고 바이트 어레이를 얻고 난 후엔 그 임시파일을 삭제하고 하는 등의 썩 기분이 좋지 못한 행동을 하는 것이 마음에 걸립니다. zip 파일을 실제 파일로 생성하지 않고 스트림만을 가지고 바이트어레이로 리스폰스엔티티에 담에 내려보내고 싶습니다.

github을 뒤져 보았지만 제 니즈에 정확히 맞는 라이브러리는 찾지 못한것 같네요.

혹시 알고계신 오픈소스 라이브러리가 있으면 알려주세요.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 기본 라이브러리를 활용하세요 java.util.zip 정영훈 2020.7.16 14:44

1 답변

  • 현재 띄워져 있던 창이 제플린이라...스칼라로 샘플 작성합니다.

    샘플코드는 자바와 큰차이는 없으니 쉽게 이해하리라 생각합니다.

    코드는 ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC 문자열을 압축하는 겁니다.

    import java.util.zip._
    import java.io._
    
    val buffer = new ByteArrayOutputStream(4096)
    val w = new ZipOutputStream(buffer)
    w.putNextEntry(new ZipEntry("filename.txt"))
    w.write(Array[Byte](65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67, 65, 66, 67))
    w.finish()
    w.flush()
    w.closeEntry()
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)