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

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

0

zip圧縮について

初めまして。
早速ですが質問させていただきます。

現在、データ(byte[])を渡してやって、それを元にzip圧縮、その後圧縮したファイルのバイト配列を取得、という処理を作成しています。
その結果、無事zipファイルを任意の場所に作成、そのファイルのバイト配列を受け取ることには成功しました。

ですが必要なものは結局zipのバイト配列なので、ファイル作成分が無駄なように思われます。
そこで質問なのですが、zip圧縮を行う際にファイルを作らず、zipのバイトのみ返す方法は無いものでしょうか?
(メモリ上のzipファイルを取得する、といったイメージ??)

もしあるのであれば、参考になるサイトや、アドバイス等お教えいただければ幸いです。
宜しくお願いします。

3

回答

7239

閲覧

3件の回答

評価

0

検索してみた?ここの過去ログ読んだ?
「ファイル」にどうやって「出力」しているか、自分のソースが理解できれば、想像つかんかな。

評価

0

すいません、自身の知識不足が恥ずかしい限りではありますが、過去ログを読んでもわからなかったため、お教えいただけると幸いです。

現在作ったソースは下記のようになります。ここではzipの作成のみ行い、byte[]の取得は別メソッドで行っています。

fileList:元データ
fileOutPath:作成するzipのパス+ファイル名
fileNameList:作成するzip内のファイル名
public void packDataFile(List<byte[]> fileList, String fileOutPath, List<String> fileNameList) throws Exception {

        File file1 = null;
        ZipOutputStream zipOutStream = null;
        String onlyPath = null;
        
        try {
            // zipファイルの出力先設定
            // TODO この時点でzipファイル作成
            zipOutStream = new ZipOutputStream(
                    new BufferedOutputStream(new FileOutputStream(fileOutPath)));

            StringBuilder stringBuilder = new StringBuilder(fileOutPath);
            for (int i = 0; i < fileList.size(); i++) {
                
                // パスからディレクトリ抽出
                // '/'または'\'で区切る
                int index = stringBuilder.lastIndexOf(YEN);
                
                if(index == -1){
                    index = stringBuilder.lastIndexOf(SLASH);
                }
                onlyPath = stringBuilder.substring(0,index+1);
                
                file1 = new File(onlyPath);
                
                //ファイルの数だけ繰り返す    
                ZipEntry entry = new ZipEntry(fileNameList.get(i));
                zipOutStream.putNextEntry(entry);
                //ファイルデータの出力
                zipOutStream.write(fileList.get(i));
                
                zipOutStream.closeEntry();
                
            }
            zipOutStream.finish();

        } catch (IOException e) {
            System.out.println("圧縮失敗");
        }finally{
            zipOutStream.close();
        }
    }
このメソッドで複数ファイルをまとめたzipのbyte[]を返すようにしたいのですが、どのように修正すればよいかわからず、困っています。ご助言等いただけますよう、宜しくお願いします。

評価

0

過去にもほとんど同じ質問があったと記憶してるんだけどなー。

ソースには、「ファイルに対する出力」を書いてあるんだ。
これを「byte配列に対する出力」にしてやればいい。
「出力」という部分が抽象化された存在だ。

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