package j2.lesson09;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* 課題2204 - 解答例.
* ZIPファイルからデータを取り出すプログラム.
* @author arakawa
* @version $Id: ZipUncompressor_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class ZipUncompressor {
/**
* ZIPファイルからデータを取り出すプログラム.
* @param args 無視される
* @throws IOException 入出力中に例外が発生した場合
*/
// プログラム全体
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// print "ZIP書庫ファイル名を入力:"
System.out.print("ZIP書庫ファイル名を入力:");
// zip = コンソール入力 (String)
String zip = reader.readLine();
ZipFile zipf;
try {
zipf = new ZipFile(zip);
}
// if zip が指すファイルを読み込めない
catch (IOException e) {
// print zip + "が読み込めません", 改行
System.out.println(zip + "が読み込めません");
// return
return;
}
try {
// print "書庫内のファイル名を入力:"
System.out.print("書庫内のファイル名を入力:");
// contents = コンソール入力 (String)
String contents = reader.readLine();
ZipEntry entry = zipf.getEntry(contents);
// if zip が指すファイル内に contents が存在しない
if (entry == null) {
// print zip + "内の" + contents + "が存在しません", 改行
System.out.println(zip + "内の" + contents + "が存在しません");
// return
return;
}
// print "解凍先のファイル名を入力:"
System.out.print("解凍先のファイル名を入力:");
// target = コンソール入力
String target = reader.readLine();
try {
// zip が指すファイル内の contents の内容を target に書き出す
InputStream in = zipf.getInputStream(entry);
streamCopy(in, target);
// if 読み書き中に例外が発生しなかった
// print target + "にコピーしました", 改行
System.out.println(target + "にコピーしました");
}
// else
catch (IOException e) {
// print "コピー中に例外が発生しました", 改行
System.out.println("コピー中に例外が発生しました");
}
}
finally {
zipf.close();
}
}
/**
* 指定したストリームの内容を指定したファイルに保存する。
* 入力ストリームは、このメソッド終了後にクローズされる。
* @param in 書き込み元のストリーム
* @param target 書き込み先のファイル
* @throws IOException 入出力時に例外が発生した場合
*/
private static void streamCopy(InputStream in, String target) throws IOException {
try {
OutputStream out = new BufferedOutputStream(new FileOutputStream(target));
try {
while (true) {
int b = in.read();
if (b == -1) {
break;
}
out.write(b);
}
}
finally {
out.close();
}
}
finally {
in.close();
}
}
}
|