2012-11-06 2 views
0

가끔씩 start of central directory not found; zipfile corrupt. 예외를 throw하는 .jip 파일이 내 앱에서 수신됩니다. 이 zip 파일은 Mac의 Finder에서 잘 열립니다. 나는 거기에 자바 우편 라이브러리가 같은 일을 수행 할 수 zip -FF bad.zip --out good.zipzip -FF 파일을 수정할 수있는 Java zip 라이브러리가 있습니까?

를 사용하여 이러한 파일을 명령 줄에서 모든 시간을 해결할 수

?

+0

7-ZIP의 [LZMA SDK (HTTP : // www.7-zip.org/sdk.html) 여기 유용 할 수 있습니다. – Vulcan

답변

1

엄밀히 말해서 zip은 컨테이너와 비슷하며 다른 압축 알고리즘을 포함 할 수 있기 때문에 Java에서이 명령을 실행하게 할 수 있습니다.

일반적으로 프로그래밍 방식으로 압축 된 아카이브와 관련된 문제를 조사하고 해결할 때 까다로운 작업이 될 수 있습니다.

Try this 귀하의 명령과 함께.

+0

필자는 처음에는 이것을 생각했지만 모든 운영 체제에서이 명령을 사용할 수있는 것은 아닙니다. – Vulcan

+0

그는 특정 OS를 1 개만 사용하고 있으며 다른 옵션은 가능한 모든 알고리즘, 구현 및 Zip 컨테이너의 사양을 처리하거나 압축 된 아카이브에 좋은 SDK를 사용하는 것입니다. – user1797612

0

ZipFile 클래스를 사용하거나 ZipInputStream을 사용하여 ZIP 파일을 열 수있는 방법은 두 가지가 있습니다.

내가 기억하는 한, ZipFile은 zip 파일의 중앙 디렉토리를 먼저 읽습니다. 아래에 RandomAccessFile을 사용하기 때문에 이렇게 할 수 있습니다. 그러나 ZipInputStream은 인라인 항목 정보를 사용합니다. 이는 파일 끝에있는 것으로 생각되는 중앙 디렉터리가 없거나 손상된 경우 더 좋을 수 있습니다.

따라서 ZipInputStream을 사용하여 ZIP 파일을 읽고 ZipOutputStream을 사용하여 다른 파일에 다시 쓰고 항목 정보를 복사하여 Java의 ZIP 파일을 '복구'할 수 있습니다. 잘라낸 경우 ZipInputStream의 마지막 항목에서 읽는 IO 예외를 가져올 수는 있지만 파일의 다른 이전 항목은 여전히 ​​저장할 수 있습니다.

0

ZipInputStream 및 ZipOutputStream을 사용해 보았습니다. 그러나 ZipInputStream은 "getNextEntry()"를 수행 할 때 항상 실패합니다. 기본적으로 "getNextEntry()"의 코드 행은 다음과 같습니다.

... 
    if ((entry = readLOC()) == null) { 
     return null; 
    } 
... 

일부 항목 후에는 null이 반환되어 더 이상 얻을 수 없습니다.

그러나 결국 내가 ZipFile에이 문제없이 모든 우편 항목을 읽는하고, 용액은 다음과 같이 보이기 때문에 함께 ZipOutputStream이 함께 ZipFile를를 사용하여 문제를 해결할 수 :

protected void repairZipFile(String file) throws IOException { 
    File repairZipFile = new File(file+".repair"); 
    ZipFile zipFile = new ZipFile(file); 
    Enumeration<? extends ZipEntry> zipFileEntries = zipFile.entries(); 
    InputStream zis; 
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(repairZipFile)); 
    byte[] b = new byte[1024]; 
    while(zipFileEntries.hasMoreElements()){ 
     ZipEntry zipEntry = zipFileEntries.nextElement(); 
     zos.putNextEntry(zipEntry); 
     zis = zipFile.getInputStream(zipEntry); 
     int n = zis.read(b); 
     while(n>=0) { 
      zos.write(b, 0, n); 
      n = zis.read(b); 
     } 
     zis.close(); 
     zos.closeEntry(); 
    } 
    zipFile.close(); 
    zos.flush(); 
    zos.close(); 
    Files.move(repairZipFile.toPath(), (new File(file)).toPath(), StandardCopyOption.REPLACE_EXISTING); 
} 
관련 문제