2014-05-20 2 views
0

다음은 일부 코드의 일부입니다. 나는 finally 절의 리소스를 닫아야합니다. closeEntry()를 먼저 호출하거나 close()를 호출해야합니까? 몇 가지 오류 메시지가 나타납니다.ZipOutputStream - closeEntry() first 또는 close() first

Error closing the zipoutjava.io.IOException: Stream closed at 
    java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:70) at 
    java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:189) 

ZipOutputStream zos = null; 

    try{ 

    ZipEntry entry = new ZipEntry("file.csv") 
    zipout.putNextEntry(entry); 
      csvBeanWriter = new CsvBeanWriter(writer, 
        CsvPreference.STANDARD_PREFERENCE); 
      csvBeanWriter.writeHeader(header); 
      for (Book book : bookList) { 
       csvBeanWriter.write(book, header); 
       csvBeanWriterTest.write(book, header); 

      } 

     } catch (Exception e) { 
      logger.error("Export of package data failed: " 
        + e); 

     } finally { 

      if (zipout != null) { 
       try { 
        zos.closeEntry(); 
        zos.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        logger.error("Error closing the zos" 
          + e); 
       } 
      } 
} 

답변

3

zipout을 사용하는 방식을 고려 코드 : 그래서

zipout = // open zipout someway 
// do something with it 
zipout.close(); 

을, 우리는 당신이 작성해야 zipout 뭔가와 가까운 항목을 그 블록 :

ZipEntry z = ... 
// do something with it 
zipout.closeEntry(); 

결과 구조는 다음과 같습니다 그래서

zipout = ... 

ZipEntry z1 = ... 
zipout.putNextEntry(z1); 
// write something to zipout 
zipout.closeEntry(); 

ZipEntry z2 = ... 
zipout.putNextEntry(z2); 
// write something to zipout 
zipout.closeEntry(); 

//... 

ZipEntry zN = ... 
zipout.putNextEntry(zN); 
// write something to zipout 
zipout.closeEntry(); 


zipout.close(); 

, 당신은해야한다 먼저 가까운 항목, 다음 zipout.

예제 코드 : https://community.oracle.com/thread/2097141?start=0

1

ZipOutputStream#closeEntry()은 zip 파일의 현재 항목을 닫고, 당신은 단지 하나 개의 항목을 가지고 있기 때문에 거래의 큰 것을 isn'y. 다른 항목을 입력해야하는 경우 다음 항목을 입력하기 전에 현재 항목을 닫아야합니다.

ZipOutputStream#close()은 파일 스트림을 완전히 닫습니다. 스트림에 항목을 추가하면이 항목을 사용하십시오.

TL; DR가 넣어 closeEntry() 그것조차 필요가 OutputStream 이러한 유형의 마지막 항목을 닫을 경우 당신이 그것을 사용하는 경우, 나도 몰라 처음.

관련 문제