1

以下は、いくつかのコードの一部です。最終節でリソースを閉じる必要があります。最初に closeEntry() または close() を呼び出す必要がありますか? エラーメッセージが表示されます。

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);
                }
            }
}
4

2 に答える 2

7

を使用するスキームを考えてみましょう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

于 2014-05-20T15:40:16.033 に答える
2

ZipOutputStream#closeEntry()は、zip ファイル内の現在のエントリを閉じます。エントリが 1 つしかないため、それほど大きな問題ではありません。別のエントリを入れる必要がある場合は、次のエントリを入れる前にまず現在のエントリを閉じる必要があります。

ZipOutputStream#close()は、ファイル ストリームを完全に閉じます。ストリームへの追加が完了したら、これを使用します。

TL;DR使用する場合はcloseEntry()最初に入力します。このタイプの の最後のエントリを閉じる必要があるかどうかはわかりませんOutputStream

于 2014-05-20T15:44:28.930 に答える