2012-10-28 6 views
0

우리는 데이터 블록을 취하고이 데이터를 압축 한 다음 결국 하나의 큰 바이트 배열로 연결하는 스레드가 있습니다. 누구든지이 아이디어를 확장하거나 다른 방법을 추천 할 수 있다면 정말 좋을 것입니다. 나는 현재 내가 밖으로 시도하고 두 가지 방법을 가지고 있지만, 어느 것도 그들이해야 방식으로 작업 :압축 된 데이터를 Deflater 또는 GZIPOutputStream과 Java 연결하기


을 첫 번째 : 나는 각 스레드의 run() 기능은 입력 데이터를 가지고 단지에 GZIPOutputStream를 사용하게 압축하여 버퍼에 씁니다.

여기에이 방법의 문제점 각 스레드 내가 GZIPOutputStream를 호출 할 때 더 이상 전체 데이터의 일부입니다 하나 개의 데이터 블록을 가지고 있기 때문에, 그것은 압축 데이터의 전체 조각으로 그 작은 블록을 취급한다는 것이다. 즉 머리글과 예고편 (예 : 사용자 지정 사전을 사용하므로 머리글이 현재 얼마나 많은지 알 수 없으며 찾을 방법이 없습니다)을 의미합니다.

머리글과 트레일러를 수동으로자를 수 있고 압축 된 데이터 만 남기고 (첫 번째 블록의 머리글과 마지막 블록의 예고편을 남겨 둡니다) 생각합니다. 이 방법으로 확신 할 수없는 또 다른 점은 내가 할 수 있는지 여부입니다. 데이터의 첫 번째 블록에 헤더를 남겨두면 여전히 압축이 해제됩니까? 해당 헤더에는 데이터의 첫 번째 블록에 대한 정보 만 포함되며 다른 연결된 블록에는 정보가 포함되지 않습니까?


번째 방법은 Deflater 클래스를 사용하는 것이다. 이 경우 입력을 설정하고 사전을 설정 한 다음 deflate()으로 전화하면됩니다.

문제은 gzip 형식이 아닙니다. 그것은 단지 "원시"압축 데이터입니다. gzip이 최종 출력을 인식 할 수 있도록 만드는 방법을 모릅니다.

+0

방금 ​​반복 질문으로 대답했습니다. 제발 여기에 같은 질문을 반복하지 마십시오. –

답변

0

다른 스레드에 의해 호출되는 단일 GZIPOutputStream에 데이터를 겹쳐 쓰지 않도록 적절한 조정을 통해 단일 GZIPOutputStream에 기록하는 메소드가 필요합니다. 또는 스레드가 임시 파일에 쓰게하고 두 번째 단계에서 모두 어셈블 및 압축 할 수 있습니다.