Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

zipファイルを含むzipファイルの解凍

zipファイルを含むzipファイルを(curreunt)\tempに展開した場合に、
展開したファイルのうちzipファイルのみデータが壊れてしまいます。
壊れてしまったzipファイルの元サイズはbufでセットしているサイズ(SIZE=1024KB)より小さいです。
しかし、展開してみるとSIZEと同サイズになってしまっています。
同じ様な現象の方がいらっしゃらないか調べてみましたが見つけられませんでした。
zipファイルをBufferedInputStreamで読み込むこと自体が間違いなのでしょうか?
どなたかお分かりになる方がいらっしゃいましたらご教授願います。


------------------- *以下ソース* -------------------
private String firmwarePackge = "firmware.zip";

private File[] extractionZip() throws Exception
    {
      setLog("zipファイルを展開します :" + firmwarePackage);
      // 解凍後のファイルサイズのデフォルト値
      // 取り合えず 1MB 確保しておけば十分のはず
      final int SIZE = 1024000;
      final String DIR_TEMP = "temp";
      Vector tmpFiles = new Vector();

      // *** check File-exist ***
      if (!controller.checkFileExists(firmwarePackage)) {
        throw new FileNotFoundException(firmwarePackage + " is not Found.");
      }
      // *** check File-type ***
      new ZipFile(firmwarePackage);

      ZipInputStream zis = new ZipInputStream(new FileInputStream(firmwarePackage));
      ZipEntry zent = null;
      BufferedInputStream bis = null;

      // アーカイブ中に含まれるファイル情報の取得
      while ((zent = zis.getNextEntry()) != null) {
        String fileName = zent.getName();
        File tempDir = new File(DIR_TEMP);
        String tempDirPath = tempDir.getAbsolutePath();
        tempDir.mkdir();

        // フォルダ
        int separator = fileName.lastIndexOf("/");
        if (separator != -1) {
          String dir = fileName.substring(0, separator);
          //   fileName = fileName.substring(separator + 1);
          File file = new File(tempDirPath + File.separator + dir);
          if (!file.exists()) {
            file.mkdir();
          }
        }

        // バイト配列を確保
        byte[] buf = new byte[SIZE];
        bis = new BufferedInputStream(zis);

        // 展開ファイルを読み出す
        int realSize = bis.read(buf, 0, SIZE);

        // currentにファイルを書き出す。
    String unZipRoot = tempDirPath + File.separator + fileName;
        FileOutputStream fos = new FileOutputStream(unZipRoot);
        fos.write(buf, 0, realSize);

        // あとかたづけ
        fos.close();
        zis.closeEntry();
        File developedFile = new File(unZipRoot);
      }

      // あとかたづけ・その2
      bis.close();
      zis.close();

    }

6

回答

3353

閲覧

6件の回答

評価

0

他のファイルも壊れていました。凹み。
バイナリファイルが壊れるようです。
BufferedInputStreamでも問題ないような気がするのですが…。

評価

0

zip用パッケージがDefaultであるからそれをつかってみたら?

評価

0

>int realSize = bis.read(buf, 0, SIZE);
>fos.write(buf, 0, realSize);

だとサイズがSIZEを超える場合に1024バイトしか出てこないように見えるんですが、いいんでしょうか。

評価

0

あのひとさん、mioさん返信ありがとうございます。

mioさんのご指摘どおり、サイズが間違っておりました。
お騒がせいたしました。
バイナリが問題ではなく、zipに含まれるファイルのうち1MBを超えるものについてデータが壊れていました。
最大で7.5MBのものもあったのですが、思いっきり単位換算を勘違いしておりました(恥

展開するzipの中身をちゃんと確認していなかった私のミスですね。
次は同じ失敗をしないぞ!!

本当にありがとうございました^^

評価

0

自分の書き込み。
文の前半は定数なのになぜ後半即値で書いてるのか…しかも単位がついてないし(汗

評価

0

mioさん

>サイズがSIZEを超える場合に1024バイトしか
ここのことでしょうか?

私の勘違いに比べればかわいいですよ〜
だって、エクスプローラで7000KBって書いてあるのに1MBあれば足りる!って思っちゃったくらいですからwww
(↑笑い事じゃない。)

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。