필요한 방식으로 재개 가능한 압축을 지원하는 미리 제작 된 라이브러리를 찾을 수 없습니다. 그러나 오픈 라이센스에 따라 직접 작성할 수있는 많은 것들이 있습니다. 이제는 질문에 설명 된 모든 제약 조건을 충족시키는 클라이언트/서버 솔루션을 얻었습니다.
아이디어는 위에서 설명한 청크 아이디어와 비슷하지만 서버가 청크를 관리하고 클라이언트의 압축 된 청크를 서버의 압축 된 청크에 매핑하는 부기를 수행합니다. 솔루션에 임시 파일이 없습니다.
(1) The client sends a manifest to the server, containing the
to-be contents of the zip file
(2) The server sends back an ID for the manifest
Then repeatedly
(3) The client asks the server "is there anything still
required for the manifest with ID X"
(4) The server replies "no", or with a manifest entry
for a file in the manifest, plus a offset and length to send
(5) The client compresses that chunk and sends it (plus some
bookkeeping info)
(6) The server puts the chunk into the every growing zip file,
plus appropriate zip file crud. If the server orders
the chunks it asks the client for appropriately, this can
all be done by file appends.
서버는 (서버 또는 클라이언트에 충돌 포함) 3-6 단계 중 고장 안전 (잘, 더 재개 될 수 있도록마다 6 단계가 성공적으로 완료 매니페스트 업데이트를 다음과 같이 기본 프로토콜입니다 이하).
청크 와이즈 zip 파일 생성을 수행하는 데 조금 비판적이었던 몇 가지 비트가 있습니다. 달성해야 할 기본 사항은 청크 가능 압축 알고리즘을 찾는 것입니다. 수축은 이러한 방식으로 사용될 수 있습니다.
자바 ZipOutputStream 및 DeflaterOutputStream은 임의의 플러시를 허용하지 않으므로 '청크 와이즈'디플레이션/압축에 적합하지 않습니다. http://www.jcraft.com/jzlib에는 ZLib의 BSD 스타일 라이선스 된 Java 구현이 있습니다. 필자는 속도를 벤치마킹하지 않았지만 Java 구현과 동일한 결과를 제공합니다. JZLib는 훌륭하고 ZLib의 모든 플러시 모드를 지원합니다 (java.util.zip.Deflate 구현과 달리).
또한 Zip 파일은 각 항목에 대해 CRC를 계산합니다. 따라서 4 단계의 매니페스트 항목에는 '부분적인'CRC가 포함되어 있습니다. 각 부분은 업데이트되고 5 단계의 장부 정보로 다시 전송됩니다. http://www.axlradius.com/freestuff/CRC32.java에 java에 대한 공개 CRC 구현이 있습니다. 나는 그것을 벤치마킹했으며 네이티브 java 구현만큼 빠르며 동등한 CRC를 제공합니다.
마지막으로, Zip 파일 형식은 꽤 당황 스럽습니다. 필자는 위키 피 디아 페이지와 http://www.pkware.com/documents/casestudies/APPNOTE.TXT에서 대부분의 구현을 함께 처리했습니다. 어느 시점에서 필자는 필드 중 하나에 대해 올바른 값을 사용할 수 없었습니다. 다행히도 JDK의 ZipOutputStream 소스를 사용하면 자신이하는 일을 볼 수 있습니다.
두 사람이 청킹을 제안했습니다. 이것은 위의 조건 (2)을 제외하고는 좋은 생각입니다. 만약 내가 덩어리면, 나는 (내가 알고있는) 청크에서 유효한 .zip/.gz 파일을 만드는 방법이 없다. –
내가 말했듯이 클라이언트에 파일을 저장하거나 서버에 다시 어셈블해야합니다. 유일한 대안은 효과적으로 전체 파일을 메모리에로드하고 어쨌든 클라이언트에서 파일의 메모리 내 버전을 만드는 것입니다. – cletus