5

Java を使用して zip ファイルを扱うのはまったく初めてで、奇妙な状況に遭遇しました。

解凍に使用している方法は次のとおりです。

public void unzip(File zipFile, File rootDir) throws IOException
{
    ZipFile zip = new ZipFile(zipFile);
    Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();

    while(entries.hasMoreElements()) {
        ZipEntry entry = entries.nextElement();
        java.io.File f = new java.io.File(rootDir, entry.getName());
        if (entry.isDirectory()) { // if its a directory, create it
            continue;
        }

        if (!f.exists()) {
            f.getParentFile().mkdirs();
            f.createNewFile();
        }

        /*BufferedInputStream bis = new BufferedInputStream(zip.getInputStream(entry)); // get the input stream
        BufferedOutputStream bos = new BufferedOutputStream(new java.io.FileOutputStream(f));
        while (bis.available() > 0) {  // write contents of 'is' to 'fos'
            bos.write(bis.read());
        }
        bos.close();
        bis.close();*/

        InputStream is = zip.getInputStream(entry);
        OutputStream os = new java.io.FileOutputStream(f);
        byte[] buf = new byte[4096];
        int r ;
        while ((r = is.read(buf)) != -1) {
            os.write(buf, 0, r);
        }
        os.close();
        is.close();
    }   
}

ただし、IOException がスローされ、メッセージは次のとおりです。

情報 | jvm 1 | 2012/11/30 01:58:05 | java.util.zip.ZipException: zip ファイルを開く際のエラー

情報 | jvm 1 | 2012/11/30 01:58:05 | java.util.zip.ZipFile.open(ネイティブメソッド)

情報 | jvm 1 | 2012/11/30 01:58:05 | java.util.zip.ZipFile.(ZipFile.java:127) で

情報 | jvm 1 | 2012/11/30 01:58:05 | java.util.zip.ZipFile.(ZipFile.java:143) で

誰かがこれについて私を助けることができますか?

どうもありがとう。

アップデート:

Linux をテスト環境として使用しています。解凍ディレクトリのパーミッションは drwxr-xr-x –</p>

更新 02:

@heikkim からの提案を採用することにより、

ファイルを手動で解凍しようとして、Linuxでunzipコマンドを使用しようとしました。次のメッセージがあります。

アーカイブ: TMA_Template.zip 注意: zipfile コメントが切り捨てられた警告 [TMA_Template.zip]: zipfile はマルチパート アーカイブの最後のディスクであると主張しています。すべてのパーツが順番に連結されていると仮定して、とにかく処理を試みます。「エラー」と警告が発生することを期待してください...真のマルチパート サポートはまだ存在しません (近日公開予定)。エラー [TMA_Template.zip]: zipfile に 6366880279 バイトがありません (とにかく処理しようとしています) エラー [TMA_Template.zip]: zipfile の先頭より前にシークしようとしています (適切な BINARY モードで zipfile を転送または作成したことを確認してください) UnZip を適切にコンパイルしている)

4

1 に答える 1

0

この方法を試してみてください:

private void unzip() throws IOException {
    int BUFFER = 2048;
    BufferedOutputStream dest = null;
    BufferedInputStream is = null;
    ZipEntry entry;
    ZipFile zipfile = new ZipFile("latest.zip");
    Enumeration e = zipfile.entries();
    (new File(root)).mkdir();
    while (e.hasMoreElements()) {
        entry = (ZipEntry) e.nextElement();
        //outText.setText(outText.getText() + "\nExtracting: " + entry);
        if (entry.isDirectory()) {
            (new File(root + entry.getName())).mkdir();
        } else {
            (new File(root + entry.getName())).createNewFile();
            is = new BufferedInputStream(zipfile.getInputStream(entry));
            int count;
            byte data[] = new byte[BUFFER];
            FileOutputStream fos = new FileOutputStream(root + entry.getName());
            dest = new BufferedOutputStream(fos, BUFFER);
            while ((count = is.read(data, 0, BUFFER)) != -1) {
                dest.write(data, 0, count);
            }
            dest.flush();
            dest.close();
            is.close();
        }
    }
}
于 2012-11-30T09:51:51.663 に答える