Zipper

ディレクトリをzipにするやつ

ディレクトリをzipにするやつ

  • タグ:
  • タグはありません
package jp.ac.keio.sfc.ht.boro.boromodelgenerator;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


public class Zipper {

	private ZipOutputStream zos;
	private File zipFile;
	
	
	/**
	 * directoryをZIPで圧縮してzipFileというzipを作成する
	 * @param directory
	 * @param zipFile
	 */
	public void zipDirectory(File directory, File zipFile) {
		this.zipFile = zipFile;
		
		try {
			zos = new ZipOutputStream(new FileOutputStream(zipFile));
			encode(zos, directory);
		
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		
		} catch (IOException e) {
			e.printStackTrace();

		} finally {
			// ZipOutputStreamを閉じる
			try {
				zos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 再帰的にZipでencFileを圧縮していく
	 * @param zos
	 * @param encFile
	 * @throws IOException
	 */
	private void encode(ZipOutputStream zos, File encFile) throws IOException {
		for(File file : encFile.listFiles()) {
			if(file.isDirectory()) {
				// ディレクトリならば中の階層に移って実行する
				encode(zos, file);
				
			} else if(file.getPath().equals(zipFile.getPath())) {
				// 作成するzipファイルは無視する
				
			} else {
				// ファイルならば圧縮して書き込む
				zos.putNextEntry(new ZipEntry(file.getPath()));
				InputStream is = new BufferedInputStream(new FileInputStream(file));
				
				int n;
				while((n = is.read()) != -1) {
					zos.write(n);
				}
				is.close();
			}
		}
	}
}