자바에서 사용 할 수 있는 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을 뒤져 보았지만 제 니즈에 정확히 맞는 라이브러리는 찾지 못한것 같네요.
혹시 알고계신 오픈소스 라이브러리가 있으면 알려주세요.
-
(•́ ✖ •̀)
알 수 없는 사용자
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()
댓글 입력