2012-06-19 3 views
2

사용자가 파일을 압축하고 압축을 풀 수있는 응용 프로그램을 Android 용으로 만들었으며 패키지 java.util.zip을 사용했습니다. 다 괜찮아. 속도, 파일은 완전히 압축되고 디렉토리와 함께 압축이 해제됩니다. 유일한 문제는 응용 프로그램이 큰 파일 (1GB 이상)을 압축/압축 해제 할 수 없다는 것입니다.Java 큰 파일 (> 1GB)을 압축/압축 해제

문제는 내 buffer의 크기라고 생각합니다. 필자가 보았던 다른 코드는 버퍼의 값이 1024 또는 2048 또는 8192이지만 내 버퍼의 값은 선택한 파일의 크기를 기반으로합니다 (단지 유연하게 만듭니다). 그러나 사용자가 큰 파일 (크기가 8 자리 이상)을 선택하면 오류가 발생합니다. 나는이 사이트에서 그물과 여기를 찾았지만 대답을 찾을 수 없다. 내 문제는이 유사합니다 미래에 도움을

To Compress a big file in a ZIP with Java

감사합니다! :)

편집 : 의견과 답변을

감사합니다. 정말 많은 도움이되었습니다. 내 생각에 자바에서 압축/압축 해제에서 BUFFER은 파일 크기를 의미하므로 내 프로그램에서는 버퍼 크기를 유연하게 만들었습니다 (버퍼 크기 = 파일 크기). 누군가가 버퍼가 작동하는 방식을 설명해 주시겠습니까? 왜 BUFFER에 고정 값이 있는지 알 수 있습니다. 또한 다른 사람들이 왜 버퍼 크기가 8k인지 아니면 더 나은지에 대해 사람들이 말하는 이유를 이해할 수 있습니다. 고마워요! :)

+2

코드를 게시하시기 바랍니다 - 당신은 버퍼 크기를 선택 특히 부분. 네 버퍼가 너무 커지는 것 같아. – Polynomial

+2

파일 크기에 따라 버퍼 크기를 조정할 필요가 없습니다. 어떤 것이 든 그 아래에있는 I/O 레이어와 일치하도록 조정해야합니다. 그건 까다 롭고 휴대용이 아닙니다. 고정 된 버퍼 크기 만 있으면됩니다. – Thilo

+0

다항식, 귀하의 권리는 제 경우입니다. Thilo가 논평 한 바에 따라, 나는'버퍼'의 기능을 오해 한 것을 깨달았다. 너희 둘에게 +1. 즉, 버퍼의 고정 된 값으로 파일의 크기를 압축하거나 압축을 풀 수 있다는 뜻입니까? 그래서 다른 버퍼 크기의 목적은 무엇입니까? 1024, 2048, 8192 등등? – John

답변

4

버퍼 크기를 파일 크기로 설정하면 파일 크기가 너무 커서 사용 가능한 메모리가 없을 때마다 OutOfMemoryError가 발생합니다.

일반적인 버퍼 크기를 사용하면 한 번에 모든 데이터를 스트리밍 방식으로 처리 할 수 ​​있습니다. 한 번에 하나의 청크로 데이터를 버퍼링합니다.

클래스는 버퍼링 된 출력 스트림을 구현

설명은, 예를 들면 BufferedOutputStream의 문서를 참조. 이러한 출력 스트림을 설정하면 응용 프로그램은 기본 시스템에 대한 호출을 발생시키지 않고 기본 출력 스트림에 바이트를 쓸 수 있습니다.

따라서 버퍼를 사용하면 비 버퍼링 쓰기보다 더 효율적입니다.

그리고 write 방법에서

:

보통이 방법은 저장, 필요에 따라 기본 출력 스트림에 버퍼 플러싱이 스트림의 버퍼에 지정된 배열 바이트. 다만, 요구 된 길이가이 스트림의 버퍼보다 ​​큰 경우는,이 ​​메소드는 버퍼를 플래시 해, 바이트를 직접 기본이되는 출력 스트림에 기입합니다.

각 쓰기는 버퍼가 가득 찰 때까지 메모리 내장 버퍼를 채 웁니다. 버퍼가 가득 차면 버퍼가 비워지고 지워집니다. 매우 큰 버퍼를 사용하는 경우, 플러시 전에 많은 양의 데이터가 메모리에 저장됩니다. 버퍼의 크기가 입력 파일의 크기와 같으면 플러시하기 전에 전체 내용을 메모리로 읽어야합니다.기본 버퍼 크기를 사용하는 것이 좋습니다. 더 많은 물리적 쓰기 (플러시)가있을 것입니다. 당신은 폭발하는 것을 피합니다.

API를 사용하면 특정 버퍼 크기를 지정할 수 있으므로 응용 프로그램에 맞게 메모리 사용량과 I/O 사이에 적절한 균형을 선택할 수 있습니다. 성능을 위해 응용 프로그램을 조정하면 버퍼 크기를 조정할 수 있습니다. 그러나 많은 경우 상황에 따라 기본 크기가 적당합니다. 단순히 같은 최대 버퍼에 대한 크기, 뭔가를 설정하는 데 도움이 같은

+1

좋은 버퍼 크기는 약 8K가 될 것입니다 –

+0

그래, 내 경우입니다. OutOfMemoryError. 버퍼가 어떻게 작동하는지 나에게 설명해 주시겠습니까? 왜냐하면 버퍼 크기가 파일의 크기와 같아야한다고 생각했기 때문입니다. 고마워요! – John

+0

콘스탄틴, 제안에 감사드립니다! 하지만 왜 저에게 더 나은 이해를 설명해 주실 수 있습니까? 감사! :) – John

1

그것은 소리 :

//After calculating the buffer size bufSize: 
bufSize = Math.min(bufSize, MAXSIZE); 
+0

왜 버퍼가 더 커지나요? – Thilo

+0

@ Thilo 아무 생각없이 8k 이상의 버퍼 크기는 대개 거의 이점을 제공하지 않습니다. 저는 John이 가변 버퍼를 사용하고 싶어한다고 가정했습니다. – Jave