2017-05-03 197 views
0

如何解決此異常?我需要將多個xlsx添加到zip。第一XLSX被添加到列表中,但第二個引發此錯誤:Zip Outputstream已關閉。 java.io.IOException:流關閉

public void downloadData() throws Exception { 

    FacesContext fc = FacesContext.getCurrentInstance(); 
    setSourceList(new ArrayList<String>()); 
    setTargetList(new ArrayList<String>()); 

    List<String> tempList = dualList.getTarget(); 
    System.out.println(tempList.size()); 

    if (tempList != null && tempList.size() > 0) { 

     ExternalContext ec = fc.getExternalContext(); 
     ec.responseReset(); 

     ec.setResponseContentType("application/zip"); 
     ec.setResponseHeader("Content-Disposition", "attachment; filename=\"Export.zip\""); 
     ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); 
     ZipOutputStream zip = new ZipOutputStream(outByteStream); 
     OutputStream outStream = ec.getResponseOutputStream(); 

     for (int i = 0; i < tempList.size(); i++) { 

      outByteStream = new ByteArrayOutputStream(); 
      //zip = new ZipOutputStream(outByteStream); 
      // outStream = ec.getResponseOutputStream(); 

      int id = ownerNameIdMap.get(tempList.get(i)); 
      String oName = tempList.get(i); 
      String fileName = oName + ".xlsx"; 

      if (petList != null && petList.size() > 0) { 
       petList.clear(); 
      } 

      workBook = new XSSFWorkbook(); 

      OwnerModel ownerModel = ownerMap.get(id); 
      ownerFirstName = ownerModel.getFirstName(); 
      ownerLastName = ownerModel.getLastName(); 
      workSheet = workBook.createSheet(ownerLastName + ", " + ownerFirstName); 
      petList = iOwnerRepository.getActivePetsOfOwner(ownerModel.getId()); 
      petCount = petList.size(); 
      createMasterSheet(); 
      renderSheet(ownerModel); 

      workBook.write(outByteStream); 
      //addEntry(zip, fileName, outByteStream); 
      ZipEntry entry = new ZipEntry(fileName); 
      zip.putNextEntry(entry); 
      System.out.println(fileName); 
      zip.write(outByteStream.toByteArray()); 
      zip.closeEntry(); 
      workBook.write(zip); 
      outStream.write(outByteStream.toByteArray()); 


     } 

     outStream.flush(); 
     outStream.close(); 
     zip.close(); 
     fc.responseComplete(); 

    } 

} 

我的堆棧跟蹤

SEVERE: Received 'java.io.IOException' when invoking action listener '#{exportViewBean.downloadData}' for component 'j_idt83' 
May 03, 2017 11:24:13 AM javax.faces.event.MethodExpressionActionListener processAction 
SEVERE: java.io.IOException: Stream closed 
    at java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:97) 
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:190) 
    at com.fetchinglife.modules.dataimport.views.ExportViewBean.downloadData(ExportViewBean.java:218) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153) 
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) 
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:771) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:300) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:105) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
+0

代碼段中的哪一行表示行218? – Thomas

+0

zip.putNextEntry(entry);這條線 – rParvathi

+0

@Thomas你有什麼解決辦法? – rParvathi

回答

0

嘗試合併使用outByteStream。在您的for循環之前打開它,並用它初始化zip,但在for循環的內部,您將另一個ByteArrayOutputStream實例指定爲outByteStream並隨後使用該循環。我不確定這是否會導致您的異常,但它可能值得嘗試......

+0

謝謝。我試了一下 – rParvathi

+0

我試過但沒有工作。它顯示無法打開存檔。 – rParvathi

相關問題