Java 에서 압축된 파일을 처리하는 알고리즘이 궁금합니다~
조회수 4208회
안녕하세요~
자바로 압축을 해제하는 알고리즘이나 프로세스가 궁금해서 질문 드립니다~
ZIP 파일로 압축된, MultipartFile 또는 File 로 부터 압축을 해제하게 되면
보통의 경우 새로운 파일을 만들게됩니다. (많은 샘플코드의 경우....)
압축파일 > 압축해제 > 압축하기 전 파일생성(오리진 파일)
하지만, 사실상 압축을 해제하는 건 해당파일을 다른곳으로 업로드 하기 위함인데요,
결국 임시파일을 만들어줘야 하고, 업로드가 끝나면 해당 파일을 삭제하게끔 하는 것 같은데
이 방법이 최선인지 궁금합니다.
다른 방법이 있는것은 아닌지.... 궁금합니다~
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
JavaDoc의 예제를 먼저 참고해보세요.
우선 질문의 의도가 ZIP 압축된 내용중 일부를 임시파일 생성없이 전송하는 것이 목적이라면, 위의 예제를 다음과 같이 변형해볼 수 있겠습니다.
Zip파일의 경우, ZipEntry 객체를 통해서 ZIP 압축된 내용의 파일들을 찾아낼 수 있습니다.
import java.io.*; import java.util.zip.*; public class Sample { final int BUFFER = 2048; public static void main (String argv[]) { try { BufferedOutputStream dest = null; FileInputStream fis = new FileInputStream(argv[0]); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); // ZIP압축을 읽기 위한 스트림 준비 ZipEntry entry; // ZIP압축된 내용에 포함된 파일들에 대응될 변수 while((entry = zis.getNextEntry()) != null) { // 순차적으로 검색합니다. ...; // 찾고자 하는 파일이 맞을 경우 // entry.name() 은 압축 파일내의 경로를 포함한 이름입니다. int count; byte data[] = new byte[BUFFER]; OutputStream os = ...; // 압축해제된 내용을 전송하려고 하는 스트림 dest = new BufferedOutputStream(os, BUFFER); while ((count = zis.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); // 압축해제하면서 전송. } dest.flush(); dest.close(); } zis.close(); } catch(Exception e) { e.printStackTrace(); } } }
위와 같이 하면, 임시파일을 만들지 않고 할수는 있습니다. 압축해제하여 포함된 모든 파일을 전송하는 것이 목적이라면, 임시파일을 생성하는 것이 더 좋을 수도 있습니다.
전송과 동시에 압축/압축해제 참고.
단일 파일 스트림에 대해서 압축을 하고자 한다면, GZIP 압축 스트림을 사용해보는 것도 좋을것 같습니다. GZIP은 스트림 그대로 압축(혹은 압축해제)하면서 처리할 수 있는 압축알고리즘이어서 별도의 임시파일을 생성하지 않고 사용할 수 있습니다.
GZIPInputStream
OutputStream os = new ByteArrayOutputStream(); // 파일 혹은 소켓, HTTP 등 쓰기 위한 스트림. 이 예에서는 ByteArrayOutputStream으로 하였습니다. GZIPOutputStream gout= new GZIPOutputStream(os); gout.write(...); // gout에 압축되지 않은 데이터를 쓰면, 결과적으로 압축한 것을 타겟 스트림(os)에 전달합니다. gout.close();
GZIPOutputStream
byte[] gzippedData = ...; // GZIP으로 압축된 데이터 InputStream is = new ByteArrayInputStream(gzippedData); // 파일 혹은 소켓, HTTP 등에서 읽기 위한 스트림. 이예에서는 ByteArrayInputStream으로 하였습니다. GZIPInputStream gin = new GZIPInputStream(is); byte[] buffer = new byte[100]; int length; while((length = bufferedInputStream.read(buffer)) > 0) { ...; // buffer에는 압축이 해제된 내용이 들어갑니다. } gin.close();
댓글 입력