2016-06-11 4 views
1

Zip 파일이 있는데 그 안에 하나의 파일을 다른 파일로 바꾸고 싶습니다. 따라서 zip 항목을 지울 필요가 없습니다. 단지 zip 항목의 파일을 다른 항목으로 대체하십시오.Java에서 압축을 풀지 않은 채로 Zip 파일 바꾸기

다음은 내가 시도한 것입니다.

public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced) 
     throws IOException { 
    String zipEntryName; 
    for(Enumeration<?> e = zipFile.entries(); e.hasMoreElements();) { 

     ZipEntry entryIn = (ZipEntry) e.nextElement(); 
     zipEntryName = entryIn.getName(); 
      if(zipEntryName.endsWith(configFileToReplaced)) { 

       FileInputStream fis = new FileInputStream(pathToNewFile); 
       ZipEntry zipEntry = new ZipEntry(zipEntryName); 

       zos.putNextEntry(zipEntry); 

       byte[] bytes = new byte[1024]; 
       int length; 
       while ((length = fis.read(bytes)) >= 0) { 
        zos.write(bytes, 0, length); 
       } 

       zos.closeEntry(); 
       fis.close(); 
      } else { 
       zos.putNextEntry(entryIn); 
       InputStream is = zipFile.getInputStream(entryIn); 
       byte [] buf = new byte[1024]; 
       int len; 
       while((len = (is.read(buf))) > 0) {    
        zos.write(buf, 0, len); 
       } 
      zos.closeEntry(); 
      } 


    } // enf of for 
} 

나는라는 이름의 파일 압축 항목이 있습니다

WEB-INF/classes/config/app-dev.yml 

을 나는 나는에있는 파일을 복사 할 수 있어요 위치

D:/app-dev.yml 

에서 위치 D 드라이브에서 파일이 바꾸려는 파일을 대체하여 다른 zip 파일. 하지만 실제로는 필요하지 않습니다 (다른 파일을 만들 때). 그럼 파일을 내 사용자 지정 파일로 바꾸려면 어떻게해야합니까?

Stackoverflow에서 다른 게시물을 검색했지만 필요한 항목을 찾을 수 없습니다. 그 zip 항목을 삭제할 수는 없지만 그것을 대체하는 것은 어떨까요? 제발 도와주세요

답변

2

문제는 새 파일이 이전 파일보다 클 수 있다는 것입니다. 변화를 허용하기 위해 한 일을 정확하게 수행해야합니다. 새 파일 인 ZIPped가 일 확률은 정확히이고 이전 파일과 크기가 거의 같습니다.

+0

예 대체 할 파일의 크기는 바이트 수와 다릅니다. 그러나 그렇습니다 차이가있을 것입니다. 그래서 어떻게 바꿀 수 있습니까? 우리는 파일을 대체 할 수있는 방법이 없다는 것을 의미합니까 (크기가 항상 달라지기 때문에) –

+0

정확히 : 더 큰 데이터를위한 공간을 만들기 위해 파일의 나머지 데이터를 복사하는 코드는 다음과 같습니다. 단순히 다음보다 더 복잡합니다 : 1) 위에서 보여준 것을하십시오; 2) 이전 파일을 삭제합니다. 3) 새 파일의 이름을 바꿉니다. –

+0

5 개의 구성 파일이 있고 zip 파일 크기가 170MB이므로 압축 파일을 다섯 번, 5 X 170MB 파일로 생성하므로 대용량 파일을 5 번 생성하고 바꾸고 이름을 바꾼다는 것은 매우 비효율적입니다. –

2

표준 Java ZIP 파일 라이브러리에서는 기존 ZIP 파일을 업데이트 할 수 없습니다. 타사 라이브러리를 사용해야합니다. Google 검색은 여러 가지 대안을 찾아야합니다.

는하지만 몇 가지주의해야 :

  • 응용 프로그램 ... 또는 시스템이 ... 충돌이 ZIP 파일을 업데이트하는 동안, 파일이

    을 손상 될 수 있습니다합니다.

  • ZIP 파일을 업데이트하면 파일의 대체 버전이 ZIP에 추가됩니다. 의 이전 버전은 여전히 ​​우편 번호에 있지만 우편 번호 색인에는 포함되지 않습니다. 따라서 ZIP 파일을 다시 작성하지 않고 업데이트하면 디스크 공간이 낭비됩니다.

+0

확실한 감사합니다. 그러한 라이브러리를 아십니까? 제안 할 수 있니? –

+0

라이브러리를 추천 할 수 없습니다. 그러나 Google을 사용하여 찾을 수 있습니다. –

+0

하나의 https : // github을 발견했습니다.co.kr/zeroturnaround/zt-zip 정확히 내 문제를 해결하지 못했지만 작동하도록 할 수 있습니다. 제안 해 주셔서 감사합니다. –