ファイルの解凍と圧縮


package com.kehwa.me17.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
/*
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;*/
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *  ZIP           
 */
public class CompressUtil {
	
	private final static Log log = LogFactory.getLog(CompressUtil.class);
	
	/**
	 *         
	 * @param baseDirName		      
	 * @param fileName			               ,
	 *   *             。
	 * @param targetFileName	  ZIP  
	 */
	public static void zipFile(String baseDirName,String targetFileName) {
		//         
		if (baseDirName == null){
			log.info("    ,      :" + baseDirName);
			return;
		}
		File file = new File(baseDirName);
		if (!file.exists()){
			log.info("    ,     :" + baseDirName);
			return;
		}
		
		
		String baseDirPath = file.getAbsolutePath();
		//    
		File targetFile = new File(targetFileName);
		
		try{
			//    zip            zip   
			ZipOutputStream out =new ZipOutputStream(
					new FileOutputStream(targetFile)); 
				if (file.isFile()){
					CompressUtil.fileToZip(baseDirPath, file, out);
				} else {
					CompressUtil.dirToZip(baseDirPath, file, out);
				}
			out.close(); 
			log.info("      ,     :" + targetFileName);
		} catch (IOException e){
			log.info("    :" + e);
			e.printStackTrace();
		}
	}

	/**
	 *    ZIP  , ZIP         targetDIR   
	 * @param zipName	     ZIP   
	 * @param targetBaseDirName	    
	 */
	public static void upzipFile(String zipFileName, String targetBaseDirName){
		if (!targetBaseDirName.endsWith(File.separator)){
			targetBaseDirName += File.separator;
		}
        try {
        	//  ZIP    ZipFile  
        	ZipFile zipFile = new ZipFile(zipFileName);
            ZipEntry entry = null;
            String entryName = null;
            String targetFileName = null;
            byte[] buffer = new byte[4096];
            int bytes_read; 
            //  ZIP      entry
            Enumeration entrys = zipFile.getEntries();
            //    entry
            while (entrys.hasMoreElements()) {
            	entry = (ZipEntry)entrys.nextElement();
            	//  entry   
            	entryName =  entry.getName();
            	System.out.println(entryName);
            	targetFileName = targetBaseDirName + entryName;
            	
            	if (entry.isDirectory()){
            		//    entry     ,     
            		new File(targetFileName).mkdirs();
            		continue;
            	} else {
            		//	  entry     ,      
            		new File(targetFileName).getParentFile().mkdirs();
            	}
           	
            	File targetFile = new File(targetFileName);
            	FileOutputStream os = new FileOutputStream(targetFile);
            	InputStream  is = zipFile.getInputStream(entry);
            	while ((bytes_read = is.read(buffer)) != -1){
            		os.write(buffer, 0, bytes_read);
            	}
            	//   
            	os.close( );
            	is.close( );
            }
            log.info("       !");
        } catch (IOException err) {
            System.err.println("       : " + err);
        }
	}
	
	/**
	 *       ZIP   。
	 */
	private static void dirToZip(String baseDirPath, File dir, 
			ZipOutputStream out){
		if (dir.isDirectory()){
			//  dir       
			File[] files  = dir.listFiles();
			//        
			if (files.length == 0){
				ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));  
				//	      
				try {
					out.putNextEntry(entry);
					out.closeEntry();
				} catch (IOException e) {
					e.printStackTrace();
				}
				return;
			}
			for (int i=0; i<files.length; i++){
				if (files[i].isFile()){
					//     ,  fileToZip  
					CompressUtil.fileToZip(baseDirPath, files[i], out);
				} else {
					//     ,    
					CompressUtil.dirToZip(baseDirPath, files[i], out);
				}
			}
		}
	}
	/**
	 *       ZIP   
	 */
	private static void fileToZip(String baseDirPath, File file, 
			ZipOutputStream out){
		FileInputStream in = null;
		ZipEntry entry = null;
		//	       
		byte[] buffer = new byte[4096];    
		int bytes_read; 
		if (file.isFile()){
			try {
				//          	
				in = new FileInputStream(file);  
				//	   ZipEntry
				entry = new ZipEntry(getEntryName(baseDirPath, file));  
				//	          
				out.putNextEntry(entry);
				//	         
				while((bytes_read = in.read(buffer)) != -1){  
					out.write(buffer, 0, bytes_read); 
				}
				out.closeEntry();
				in.close(); 
				log.info("    " 
						+ file.getAbsolutePath() + "  ZIP   !");
			} catch (IOException e){
				e.printStackTrace();
			}
		}
	}
	/**
	 *         ZIP   entry   。             
	 * @param baseDirPath
	 * @param file
	 * @return
	 */
	private static String getEntryName(String baseDirPath, File file){
		if (!baseDirPath.endsWith(File.separator)){
			baseDirPath += File.separator;
		}
		String filePath = file.getAbsolutePath();
		//     ,   entry      "/",          。
		if (file.isDirectory()){
			filePath += "/";
		}
		int index = filePath.indexOf(baseDirPath);
		return filePath.substring(index + baseDirPath.length());
	}
	
	public static void main(String[] args) {
		//  C   temp  ,       C:/temp.zip
		/*String baseDirName = "C:/";
		String fileName = "temp/";
		String zipFileName = "C:/temp.zip";*/
		String baseDirName = "E:/plat";
		String zipFileName = "E:/aa.zip";
		//CompressUtil.upzipFile("e:/ME3.zip", "E:/");
		CompressUtil.zipFile("e:/123", "e:/123.zip");
		//     ZIP      D  temp   
		//System.out.println();
		/*String zipFileName = "E:/plat.zip";
		String fileName = "E:/plat1";
		upzipFile(zipFileName,fileName);*/
		//CompressUtil.zipFile(baseDirName, fileName, zipFileName);
	}
}

 
 
補足説明はjavaを使用します.util.zipパッケージの場合、UTF-8符号化形式で読み込むファイル名であるため、中国語windowsのオペレーティングシステム(Windowsオペレーティングシステムのデフォルト文字セット:GBK)で使用するとファイル名解析エラーが発生するため、orgを使用する必要がある.apache.tools.zip.ZipEntryとorg.apache.tools.zip.ZipOutputStreamクラスがこの問題を解決します.