2016-08-24 9 views
4

XMLファイルを含むZIPファイルを受け入れるサーブレットがあります。それらのXMLファイルの内容を読んでいますが、java.io.IOExceptionが発生します。ストリームがクローズしました。ZipEntryの中のStringを読み取る:java.io.IOException:Stream closed

私はZIP、このように取得:

private byte[] getZipFromRequest(HttpServletRequest request) throws IOException { 
    byte[] body = new byte[request.getContentLength()]; 
    new DataInputStream(request.getInputStream()).readFully(body); 
    return body; 
} 

そして、私はこのようにそれを読む:

public static void readZip(byte[] zip) throws IOException { 

    ByteArrayInputStream in = new ByteArrayInputStream(zip); 
    ZipInputStream zis = new ZipInputStream(in); 

    ZipEntry entry; 

    while ((entry = zis.getNextEntry()) != null) { 
     System.out.println(String.format("Entry: %s len %d", entry.getName(), entry.getSize())); 

     BufferedReader br = new BufferedReader(new InputStreamReader(zis, "UTF-8")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
     br.close(); 
    } 
    zis.close(); 
} 

出力:

Entry: file.xml len 3459 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<test> 
correct content of my xml file 
</test> 
java.io.IOException: Stream closed 
    at java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:67) 
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:116) 
    at util.ZipHelper.readZip(ZipHelper.java:26) 

私の質問

なぜ私はこの行にこのexeptionを取得していますか?

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

私は何を欠席しましたか?

答えて

3

BufferedReaderであなたのラップを入れていますので、brを閉じるとzisも閉じます。

したがって、br.closeを削除すると、例外は発生しません。

+0

それでした。宣言をループから取り除いて後で閉じるべきですか?これを行うより良い方法はありますか? – Tim

関連する問題