ファイルの解凍と圧縮
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クラスがこの問題を解決します.