- PR -

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

投稿者投稿内容
POLON
会議室デビュー日: 2001/11/15
投稿数: 13
投稿日時: 2001-11-16 14:26
こんにちは。
みなさんの助言のおかげでなんとか作成できました。
そこでまたまた懲りずSourceを載っけてご指摘を受けたいと思います。

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

/********************************************************************
目標:中に複数のDataを入れたZip形式のFileを作成する。
手順:?外部からDataを取得→Vectorに新規(追加)登録
    [理由]File中に入れる圧縮対象Dataが何個あるかわからないので。
  :?Fileの名前を設定する
    [理由]DLする時、同名にならないようにする為。
  :?必要(圧縮対象Dataがある)な分だけRoopさせる
    [理由]圧縮対象DataをFile内に書き込む為。
  :?Fileを閉じる
********************************************************************/

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

public class ZipMaker {

 /***** 圧縮Folder生成DirectoryのPath **************/
 protected static String putDir = "./CompressedDir";
 /**************************************************/

 /***** 各種宣言 *****************************/
 protected static final int EOF = -1;
 protected static int i,j = 0;
 protected static Vector vctData = new Vector( );
 protected static Calendar makedDat = null;
 protected static File zipBox = null;
 protected static Object obj = new Object( );
 protected static String objSData = null;
 protected static ZipEntry objZData = null;
 protected static int count = 1536;
 protected static byte[ ] buff = new byte[1536];
 /********************************************/

 public static void main( String[ ] args )
 throws Exception {

  // Calendar情報の初期化
  makedDat = Calendar.getInstance( );

  while( i < args.length ) {
   // 取得したDataをVectorに新規/追加登録
   vctData.addElement( args[ i ] );
  }

  /***** Zip形式File「zipBox」の名称設定 ************
  // File名は「 YYYYMMDD_HHMMSS.zip 」で出力する。
  ***************************************************/
  int YEARs = makedDat.get( Calendar.YEAR ); // 年
  int MONTHs = makedDat.get( Calendar.MONTH ) + 1; // 月
  int DAYs = makedDat.get( Calendar.DAY_OF_MONTH );// 日
  int HOURs = makedDat.get( Calendar.HOUR_OF_DAY ); // 時
  int MINUTEs = makedDat.get( Calendar.MINUTE ); // 分
  int SECONDs = makedDat.get( Calendar.SECOND ); // 秒
  zipBox = new File( putDir + "/" + YEARs + "" + MONTHs + "" + DAYs + "_" + HOURs + "" + MINUTEs + "" + SECONDs + ".zip" );
  /**************************************************/

ZipOutputStream zipOutSt = new ZipOutputStream( new FileOutputStream( zipBox ) ); // zipBox出力Streamを作り出す
  FileInputStream fileInputSt = null;

  // Vector内のDataを生成する
  Enumeration et = vctData.elements( );

  // et内のData数分まわす
  while( et.hasMoreElements( ) ) {

   // et内の次のDataを引き出しObjectに代入する
   obj = et.nextElement( );

   // Object型DataをString型Dataに変換
   objSData = new String( obj.toString( ) );

   // Zip entryを行う
   objZData = new ZipEntry( objSData );

   // 書き込み開始
   zipOutSt.putNextEntry( objZData );

   // 圧縮対象DataのByte取得
   fileInputSt = new FileInputStream( objSData );
   while( fileInputSt.read( buff, 0, count ) != EOF ) {

    // File内に圧縮対象Dataを書き込む
    zipOutSt.write( buff, 0, count );
   }
   zipOutSt.closeEntry( );
   fileInputSt.close( );
  }
  zipOutSt.close( );
 }
}

--- ここまで --------------------------
TO しょむさん
 Roopの基本構造を解りやすく教えて頂いたので
 大変参考になりました。
 やはり本の例題だけでは"生きたProgramは作れない"っていうのが
 よく解りました。
 これからは基本知識だけでなく応用の方法も覚えたいと思います。

TO @kotoさん
 教えて頂いた書籍、早速読んでみました。
 今回の課題であった「複数選択」は残念ながら掲載されていませんでしたが
 基本的な構造を学べ、大変役に立ちました。

TO H2さん
 わざわざSourceを載せて、修正版まで見せて頂き納得致しました。
 やはり直に見せて頂くと解りやすく、またCommentも簡潔に書いて頂いたので
 大変感動いたしました。


みなさん、本当にありがとうございました。
私もJavaをMasterして皆さんの様にはやく他のProgramerにお役に立てられる様
がんばりたいと思いますので、「手間のかかるヤツ」ですがこれに懲りずに
また質問した折には教えてくださいね。

宜しくお願い致します。m(__)m


[ メッセージ編集済み 編集者: POLON 編集日時 2001-11-16 14:29 ]
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-16 15:10
なかなかうまくできてますね。あと圧縮率とか変えられると面白いかも。役に立ってとてもよかったです。私にとっても初めてjava.util.zipだったので、よい練習になりました。
3点だけ留意点です:
  • 「Roop」ではなく「Loop」です。(私もよくLとRは間違えます。 )
  • わざわざEnumerationを使う必要はないのでは?私ならこうします。
    コード:
    Vector v = new Vector();
    
    ... //vにdataを入れる
    for(int i=0; i<v.size(); i++)
    {
    String s = (String) v.get(i);
    }


  • コード:
    protected static int count = 1536; 
    
    protected static byte[ ] buff = new byte[1536];

    でせっかくcount=1536としたのですから
    コード:
    protected static int count = 1536; 
    
    protected static byte[ ] buff = new byte[count];

    としたほうが良いと思います。




[ メッセージ編集済み 編集者: H2 編集日時 2001-11-16 15:12 ]

[ メッセージ編集済み 編集者: H2 編集日時 2001-11-16 15:17 ]
POLON
会議室デビュー日: 2001/11/15
投稿数: 13
投稿日時: 2001-11-16 16:31
TO H2さん
あぁ、なるほど。
確かにVector内のデータ数を確認するだけなら
Enumerationを使わなくっても良かったのですね。
nextElement()を使おうと考えていた為に無駄な作業をしておりました。
あとRoopではなくLoopでしたね。(駅前留学してるのにぃ...。 )

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