2017-01-25 4 views
0

gzip 형식으로 압축 된 webservice xml 파일에서 받고 있습니다. XML의 원래 크기는 약 80Mb이고, 압축 된 버전은 약 10Mb입니다. 이 xml 파일은 캐시에 저장됩니다.압축 해제하지 않고 gzip 파일의 내용 바꾸기

xml 루트에는 8 자리 고유 ID를 나타내는 특성이 들어 있습니다. 따라서 캐시에서 응답을 제공 할 때 xml을 최종 사용자에게 반환하기 전에 다른 웹 서비스에서받은 ID로이 ID를 변경해야합니다.

따라서, 과정은 다음과 같아야합니다

  1. 가 캐시 XML 압축을 해제합니다.
  2. 캐시 된 ID를 웹 서비스에서받은 ID로 바꿉니다.
  3. 파일을 다시 압축하여 클라이언트로 반환하십시오.

이것은 자바 소프트웨어입니다. 전체 문서의 압축을 풀고 다시 압축하지 않고이 대체 작업을 수행 할 수있는 선택의 여지가 있는지 궁금합니다. 부분적으로 읽고 쓰는 어떤 종류의 ... 나는 모른다.

나는 이것을 할 수있는 몇 가지 자바 라이브러리를 찾고 있었지만 아무 것도 찾지 못했습니다. 어쩌면 가능하지 않기 때문일 수도 있습니다.

아이디어가 있으십니까? 감사.

+0

압축 해제, 교체 및 다시 압축 할 코드를 표시 할 수 있습니까? 개선의 여지가있을 수 있습니다. –

+0

아직 코딩되지 않았지만 아이디어는 다음과 같습니다. 1. gzipinputstream을 사용하여 압축되지 않은 문서로 바이트 []를 만듭니다. 2. 8 자리의 바이트를 바이트 단위로 바꿉니다 (임시 복사본은 사용하지 않음). 3. gzipoutputstream을 사용하여이 바이트 []를 압축합니다. – JBalaguero

답변

0

아니요 적어도 ID가 코딩 된 위치와 방법을 찾으려면 압축을 풀어야합니다. 그럼 당신은 정말 똑똑하고 다른 ID로 비트 수와 같은 스트림을 재조합하는 방법을 알아낼 수 있습니다. 현재 정의 된 코드 테이블을 사용하여 퍼즐을 본질적으로 해결합니다 (전혀 해결할 수 있다고 가정). 또는 b) 새로운 ID로 모든 것을 다시 압축하십시오.

시작 지점의 압축을 제어하는 ​​경우 ID 바로 앞에 압축 없음으로 전환하고 블록을 플러시하고 저장된 블록을 ID 바로 다음으로 전환하여 특수 스트림을 준비 할 수 있습니다 압축을 계속합니다. 출력 스트림이 어디에 있는지 알 수 있습니다. 그런 다음 나중에 스트림에 나타나는 ID를 해당 바이트로 직접 바꿀 수 있습니다. 또한 CRC를 업데이트해야합니다. 원래의 CRC와 기존의 비 압축 데이터 및 새로운 비 압축 데이터의 "원시"CRC를 배타적으로 사용할 수 있습니다. 그것은 이전 ID와 ID의 배타적 인 것입니다. 데이터 길이를 채우기 위해 앞뒤에 0이옵니다. "raw"CRC는 CRC 레지스터가 0으로 초기화되고 최종 exclusive-or이없는 CRC입니다.

관련 문제