- PR -

Zipファイルの作り方って?

投稿者投稿内容
POLON
会議室デビュー日: 2001/11/15
投稿数: 13
投稿日時: 2001-11-15 16:31
いま開発で複数のデータをひとつのファイルにZip形式で圧縮する
アプリケーションをつくっています。

イメージとしては

[Folder]
|
+---[Data_1]
|
+---[Data_2]

という感じです。

で、まとめるファイルの中に入るデータが1つだけなら
出来たのですが2つ以上になるとどうしても出来ません。

どなたか助けて頂けないでしょうか。

[ メッセージ編集済み 編集者: POLON 編集日時 2001-11-15 17:08 ]
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-15 17:08
java.util.zip.ZipOutputStream だか ZipFile だか作って、
ZipEntry をファイルごとに作ってつっこんでいく、

じゃだめなんでしょうか。

# わたしはやったことないですが。
POLON
会議室デビュー日: 2001/11/15
投稿数: 13
投稿日時: 2001-11-15 18:27
しょむさん。
早速のレスありがとうございます。

私もとりあえずこれらを使っているのですがどうも上手くいきません。
(私が下手なだけなんですが...。)
圧縮対象データはどれだけあるかわからないので
Vectorに持たせて下記の圧縮実行部分に渡しております。

---ここから-------

// 各種宣言を行う
FileInputStream[ ] flIptSt = new FileInputStream[ cnt ];
BufferedInputStream[ ] bfIptSt = new BufferedInputStream[ cnt ];
FileOutputStream flOptSt = null;
ZipOutputStream[ ] zpOptSt = new ZipOutputStream[ cnt ];
ZipEntry[ ] target = new ZipEntry[ cnt ];

while( et.hasMoreElements( ) ) {
 Object obj = et.nextElement( );

 System.out.println( "---[START]------------------------" );

 /***** Object型DataをString型に変換 *****************/
 objSt[ j ] = new String( obj.toString( ) );
 System.out.println( "ObjectStream[" + j + "] => " + objSt[ j ] );
 /****************************************************/

 // 圧縮対象Fileに接続する
 flIptSt[ j ] = new FileInputStream( objSt[ j ] );

 // 圧縮対象Fileを読み込む
 bfIptSt[ j ] = new BufferedInputStream( flIptSt[ j ] );

 // ZipBoxを生成する
 flOptSt = new FileOutputStream( zipBox );

 // ZipBox内に圧縮済Fileを書込む
 zpOptSt[ j ] = new ZipOutputStream( flOptSt );

 zipFile[ j ] = new File( objSt[ j ] );
 target[ j ] = new ZipEntry( zipFile[ j ].getPath() );
 zpOptSt[ j ].putNextEntry( target[ j ] );

 /*** ここが問題っ!! ***/
 int count;
 byte buf[ ] = new byte[1536];

 System.out.println( "COUNTER => " + cnt );
 for( int h = 0; h < cnt; h++ ) {
  while( ( count = bfIptSt[ h ].read( buf, 0, 1536 ) ) != EOF ) {
   zpOptSt[ h ].write( buf, 0, count );
  }
  bfIptSt[ h ].close( );
  flIptSt[ h ].close( );
  zpOptSt[ h ].closeEntry( );
  zpOptSt[ h ].close( );

  System.out.println( "--------------------------[END]---" );
 }

 flOptSt.close();
 j++;
}

---ここまで-------

※一部省略しております。

汚いソースですがわかりますか?

[ メッセージ編集済み 編集者: POLON 編集日時 2001-11-15 18:29 ]
@koto
会議室デビュー日: 2001/08/17
投稿数: 17
投稿日時: 2001-11-15 21:14
私も圧縮するプログラムを作成したことがないので、よくわかりませんが
「Javaのからくり2」という本でgzip,zip,jarの圧縮について書かれていた
いました。機会があったら読んでみてください。

「Javaのからくり2」
http://www.idg.co.jp/books/book/program/006/
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-15 21:18
ぅぅ。Javaに見えない…(^^;
こんなに配列使う必要はないのでは。

なんか根本的にループ構造が違う気が。

コード:

ZipOutputStream作る
まわす。中に入れたいファイルの数だけ {
ZipEntry 作る
ファイル読みながら最後までまわす{
ZipEntry につっこむ
}
ZipEntry 閉じる
ZipOutputStreamにつっこむ
}
ZipOutputStrem閉じる


前後するかもしれませんが。



[ メッセージ編集済み 編集者: しょむ 編集日時 2001-11-15 21:22 ]
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-16 10:24
コード:
zpOptSt[ h ].closeEntry( ); 
zpOptSt[ h ].close( );


でzpOptStを閉じては駄目なんではないでしょうか?閉じてしまっては次のエントリーが書き込めません。

あと、しょむさんの言われるようにループ構造が違うと思います。よく見ると、毎回zpOptSt[ j ] = new ZipOutputStream( flOptSt );ってしてますよね。これだと前のファイルが消されてしまうのではないでしょうか?

すみません、ちょっとしょむさんのに付け足しです。
コード:
ZipOutputStream作る
まわす。中に入れたいファイルの数だけ {
   ZipEntry 作る
   ZipOutputStream を現在のZipEntryに持ってくる

   ファイル読みながら最後までまわす{
     ZipOutputStream につっこむ
   }

   現在のZipEntryのZipOutputStreamを閉じる
}
ZipOutputStrem閉じる


です。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-16 10:28
簡単なサンプルを作ってみました。固定のファイルしかZipできませんが参考になると思います。
コード:

/**
* A sample zip program using java.util.zip package
* @author Hiroshi Higuchi (s2247990)
* @version 1.0
* @Created 16th November 2001
* @Updated 16th November 2001
*
* @ (C)Copyright 2001 Hiroshi Higuchi All rights reserved.
**/

import java.util.zip.*;
import java.io.*;

public class ZipTest
{
public static void main(String[] args) throws IOException
{
final int EOF = -1; //END OF FILE認識用コード
final int BUFFER_SIZE = 1024; //読み込み・書き込みバッファサイズ
final String FILE_NAME = "test.zip"; //作成Zipファイル名
final String[] FILES = {"Encode.java", "Ext.java", "Graph.java"}; //Zip対象ファイル

//変数初期化
byte[] buffer = new byte[BUFFER_SIZE];
File zip = new File(FILE_NAME);
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zip));
FileInputStream reader = null;

//中に入れたいファイルの数だけまわす
for(int i=0; i<FILES.length; i++)
{
//ZipEntryの初期化+ZipOutPutStreamをこのZipEntryに持ってくる。
ZipEntry entry = new ZipEntry(FILES[i]);
zipOut.putNextEntry(entry);
reader = new FileInputStream(new File(FILES[i]));

//対象ファイル読み込み
while(reader.read(buffer, 0, BUFFER_SIZE)!=EOF)
zipOut.write(buffer, 0, BUFFER_SIZE);

//FileInputStreamは閉じ、ZipOutPutStreamは現在のZipEntryを閉じる。
//注意!ZipOutputStreamそのものは閉じては駄目です。
zipOut.closeEntry();
reader.close();
}
zipOut.close();
}
}



↓サンプルコードを少し修正しました。最後にzipOut.close();を入れ忘れました。

[ メッセージ編集済み 編集者: H2 編集日時 2001-11-16 10:41 ]
POLON
会議室デビュー日: 2001/11/15
投稿数: 13
投稿日時: 2001-11-16 10:57
しょむさん、@kotoさん、H2さん
貴重なご意見/ご指摘本当にありがとうございます。

Java(というよりもProgram自体)を独学で覚えた為
正直、あまり自信がなかったのですが勇気をだして
Sourceを載せさせて頂きました。

これからこのProgramを作り直してみようと思うので
出来あがったらみなさん再度、見て頂けないでしょうか。

宜しくお願いします。
  & これからもご指摘の方、宜しくお願い致します。

スキルアップ/キャリアアップ(JOB@IT)