java.util.zip.ZipInputStream

目的
Zipファイルの解凍を行う

関連クラス

今回のソース
//////////////////// ziptest.java ////////////////////

class ziptest
{
	public static void main(String args[])
	{
		ZipInflator inflator = new ZipInflator(args[0]);
		if(args.length == 1)
		{
			inflator.InflateFiles();
		}
		else if(args[1].compareTo("print") == 0)
		{
			inflator.PrintList();
		}
	}
}

////////////////////////////////////////////////////////////

//////////////////// ZipInfrator.java ////////////////////

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

class ZipInflator
{
	// 解凍されるZIPファイル名
	String archive_name;

	public ZipInflator(String file_name)
	{
		archive_name = file_name;
	}

	protected ZipEntry[] GetFileList()
	{
		try
		{
			ZipInputStream input = new ZipInputStream(new FileInputStream(archive_name));
			ZipEntry zip_entry;
			Vector file_list = new Vector();

			// アーカイブ中に含まれるファイル情報の取得
			while((zip_entry = input.getNextEntry()) != null)
			{
				file_list.addElement(zip_entry);
				input.closeEntry();
			}
			ZipEntry return_list[] = new ZipEntry[file_list.size()];
			file_list.copyInto(return_list);

			input.close();
			return(return_list);
		}
		catch(IOException e)
		{
			System.err.println(e.toString());
			return null;
		}
	}

	public void PrintList()
	{
		ZipEntry file_list[] = GetFileList();
		for(int i=0;i<file_list.length;i++)
		{
			PrintFileInfo(file_list[i]);
		}
	}

	// ファイル名、解凍後のファイルサイズ、解凍前のファイルサイズの表示
	protected void PrintFileInfo(ZipEntry zip_file)
	{
		String file_name = zip_file.getName();
		long src_size = zip_file.getCompressedSize();
		long size = zip_file.getSize();

		// タブを使った位置揃え
		int number_tab = (file_name.length() / 8);
		if(number_tab > 3)
			number_tab = 3;
		number_tab = 3 - number_tab;

		String tab = "";
		for(int i=0;i<number_tab;i++)
		{
			tab = tab.concat("\t");
		}

		System.out.println(file_name + tab + size + "\t" + src_size);
	}

	public void InflateFiles()
	{
		try
		{
			ZipEntry zip_entry;
			ZipInputStream input = new ZipInputStream(new FileInputStream(archive_name));

			// アーカイブ中の各ファイルを処理
			while((zip_entry =input.getNextEntry()) != null)
			{
				String file_name = zip_entry.getName();
				long size = zip_entry.getSize();

				// I/Oストリームの作成
				FileOutputStream file_out = new FileOutputStream(file_name);
				BufferedInputStream buffered_in = new BufferedInputStream(input);

				byte data[] = new byte[(int)size];
				buffered_in.read(data,0,(int)size);
				file_out.write(data);

				file_out.close();
				input.closeEntry();
			}

			input.close();
		}
		catch(IOException e)
		{
			System.err.println(e.toString());
		}
	}
}

////////////////////////////////////////////////////////////
Source is here. (ZIP Format,1293Byte,Shift-JIS)

コンパイル&実行
javac ziptest.java
java ziptest <archive_name> (print)
printを付けると、ファイル情報のみを表示し、展開は行わない。

説明
(概略)

Zipファイルを解凍するだけのプログラムです。
JDK1.1から加えられた、java.util.zipパッケージによって、
いとも簡単に、出来るようになっています。
恐らく、Java標準のアーカイブフォーマットである、
JARファイルも、ZipInputStreamのサブクラスJarInputStreamクラスを
使うことによって、簡単に出来るのではないかと思います。

(サンプルプログラムの説明)

while((zip_entry = input.getNextEntry()) != null)
ZIPアーカイブ中に、ファイルが存在する限り、
ファイルエントリを取得し続けます。
file_list.copyInto(return_list);
Vectorクラスに貯えたオブジェクトを、
実際使うオブジェクトの型に変換するために使います。
タブを使った位置揃え
第一フィールドである、ファイル名の長さで判断して、
タブを出力する個数を決定し、表示を整形しています。
BufferedInputStream buffered_in = new BufferedInputStream(input);
サイズの大きいファイルを扱う時には、
FileInputStreamだけでは、読み込みが間に合わないようなので、
BufferedInputStreamでラッピングしてます。