2010-12-06 2 views
2

2007 Microsoft Excel에서 XML 파일 중 하나를 수정하려고합니다. 이를 위해 xlsx 파일은 Java의 ZipInputStream을 사용하여 압축 해제 된 다음 ZipOutputStream을 사용하여 새 Zip 파일로 복사됩니다. 코드 조각은 다음과 같습니다 :이 조각에서이미지의 ZipEntry를 읽은 후 Java ZipInputStream이 닫힙니다.

 FileInputStream fis = new FileInputStream("C:\\_132139TRD-GDR_Conversion.xlsx"); 
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 

     FileOutputStream fos = new FileOutputStream("C:\\_132139TRD-GDR_Conversion123.xlsx"); 
     ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos)); 

     while ((entry = zis.getNextEntry()) != null) { 

      System.out.println("Processing Entry : " + entry.getName()); 
      System.out.println("Processing Entry Size : " + entry.getSize()); 
      System.out.println("Entry Available : " + zis.available()); 

     if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){ 
      //Process XML 
     } 

     ZipEntry ze = new ZipEntry(entry.getName()); 
      zos.putNextEntry(ze); 
      if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){ 
        zos.write(XML.getBytes()); 
      }else{ 
       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       while ((count = zis.read(data, 0, BUFFER)) != -1) { 
        stream.write(data, 0, count); 
       } 
       tempBuffer = stream.toByteArray(); 
       zos.write(tempBuffer); 
      } 
      zos.closeEntry();    
     } 
     zos.close(); 
     fos.close(); 
     zis.close(); 
     fis.close(); 

, 우리는 JPEG 파일 발생 후 "항목 = zis.getNextEntry()는"null를 돌려줍니다. 우리는 다음 ZipEntry를 읽을 수 없습니다 - 불완전한 Excel로 연결됩니다. 샘플 Excel 파일의 출력은 다음과 같습니다 :

Start Date Mon Dec 06 15:33:33 IST 2010 
Processing Entry : xl/media/Logo2005_JPM_A_Black_170x50.jpeg 
Processing Entry Size : -1 
Entry Available : 1 
End Date Mon Dec 06 15:34:58 IST 2010 

ZipInputStream는 즉시 JPEG 파일이 복사로 폐쇄됩니다. (이미지를 복사 한 후에는 entryEOF 및 reachEOF 변수가 모두 true로 설정되고 항목이 null입니다).

아무도 비슷한 문제에 직면 했습니까? 파일을 복사 한 후에도 reachEOF가 true가되는 버그입니까?

Midhun.

답변

3

zis.getInputStream(entry) 대신 zis에서 이미지의 데이터를 읽었 기 때문입니다.

복사 루프 후 zis의 모든 데이터가 읽혀 지므로 EOF를 얻습니다.

관련 문제