3

ZipArchiveEntry を文字列に読み込もうとしています。以下のコードがあり、例外が発生しました

私のコードは以下の通りです

StringWriter writer = new StringWriter();
IOUtils.copy(zipFile.getInputStream(zipArchiveEntry),
              writer,
              org.apache.commons.io.Charsets.UTF_8);

そして、次の例外が発生します

java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.Reader.read(Reader.java:123)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2001)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1980)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1957)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1907)

本当に長い間それに固執しました。助けてください。

4

1 に答える 1

1

明らかに有効な ZIP の同様のケースがありましたが、Java を使用してそれを読み取るのは困難でした。例外はあなたのものに似ていましたが、スタックトレースが異なりました:

Caused by: java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:194)
at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:140)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:118)
...

私の場合、CentOS マシンで Ansible の「アーカイブ」モジュールを使用して、「機能しない」ZIP が作成されました。

- name: Create a zip archive
  archive:
    path: /tmp/mydir/
    dest: /tmp/mydir.zip
    format: zip

修正は、ZIP を作成するときに「パス」の最後にアスタリスクを追加することでした。

- name: Create a zip archive
  archive:
    path: /tmp/mydir/*
    dest: /tmp/mydir.zip
    format: zip

2 つの ZIP の内容は同じですが、ZIP 内のファイル/ディレクトリ属性に違いがあり、Java で問題が発生していると思われます。

于 2020-01-21T08:21:22.577 に答える