3

ZipOutputStreamかなり標準的なコードを使用してzipファイルを作成しています。ZipInputStream何らかの理由で、ZipEntryhasとして読み返すとsize=-1. ファイル名はZipEntry.

(OS ツールを使用して zip ファイルを作成し、それを再度読み込むと、サイズは正しいので、問題は ではZipOutputStreamなくにあると思いますZipInputStream)。

コンテキストは Spring MVC コントローラーです。

私は何を間違っていますか?ありがとう。

コードは次のとおりです。

// export zip file
String file = "/Users/me/Desktop/test.jpg";
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file+".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
zos.putNextEntry(new ZipEntry("test.jpg"));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) > 0) {
    zos.write(buffer, 0, bytesRead);
}
zos.closeEntry();
zos.close();
fis.close();

// import same file
String file2 = "/Users/me/Desktop/test.jpg.zip";
FileInputStream fis2 = new FileInputStream(file2);
ZipInputStream zis = new ZipInputStream(fis2);
ZipEntry entry = zis.getNextEntry();
// here: entry.getSize() = -1, zip.buf is an array of zeros... 
// but if I unzip the file on my OS I see that the original file has been zipped...
4

2 に答える 2

1

次の例のように、ストリームから次のエントリを取得する必要があります。

http://www.roseindia.net/tutorial/java/corejava/zip/zipentry.html

サイズを手動で設定すると、「64527」のように結果が得られます。zip の例をご覧ください。彼らはあなたに明確なイメージを与えます。また、既存の OutputStream から Java-Zip-Archive を作成します。

次のようにしてみてください。

        String inputFileName = "test.txt";
        String zipFileName = "compressed.zip";

        //Create input and output streams
        FileInputStream inStream = new FileInputStream(inputFileName);
        ZipOutputStream outStream = new ZipOutputStream(new FileOutputStream(zipFileName));

        // Add a zip entry to the output stream
        outStream.putNextEntry(new ZipEntry(inputFileName));

        byte[] buffer = new byte[1024];
        int bytesRead;

        //Each chunk of data read from the input stream 
        //is written to the output stream
        while ((bytesRead = inStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, bytesRead);
        }

        //Close zip entry and file streams
        outStream.closeEntry();

        outStream.close();
        inStream.close();
于 2012-11-05T08:18:05.607 に答える
0

entry.getSize() は単純に信頼できないようです: ZipInputStream が ZipOutputStream の出力を読み取れないのはなぜですか?

上記の投稿は、適切な回避策を提供します。

于 2012-11-05T18:09:06.273 に答える