java 實現 壓縮解壓縮(帶圖形化界面javafx)

效果:

完整演示程序下載:點此
完整代碼下載:點此
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
 * 完成文件的壓縮與解壓縮
 * 壓縮:
 * 		構造方法中傳入壓縮文件路徑
 * 		調用方法時傳入文件列表,可以單/多文件,文件目錄允許爲空
 * 解壓縮:
 * 		靜態方法,傳入壓縮文件路徑和解壓輸出目錄
 * @author M
 * @version zipBeta-1.0
 */
public class ZipIo {
	private File zipFile;
	static final int BUFFERSIZE = 4096;
	public ZipIo(String pathname){
		zipFile = new File(pathname);
	}
	/**
	 * 文件壓縮方法
	 * @param filelist <文件列表>
	 * @throws IOException
	 */
	public void compressFilelist(String[] filelist) throws IOException{
		ZipOutputStream zipOutputStream = null;
		
		zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
//			Set<String> staffsSet = new HashSet<>(Arrays.asList(filelist));
		for(String file : filelist){
			String basedir = "";
			//判斷文件類型:目錄or文件
			compressByType(new File(file),zipOutputStream,basedir);
		}
		zipOutputStream.close();
	
	}
	
	/**
	 * 根據不同文件類型選擇不同方法
	 * @param srcfFile	<待壓縮的文件名>
	 * @param zipOutputStream <輸出流>
	 * @param basedir <文件在壓縮文件中的路徑>
	 * @throws IOException
	 */
	private void compressByType(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
		
		if(srcfFile.isDirectory()){
			compressDirectory(srcfFile,zipOutputStream,basedir);
		}else {
			compressFile(srcfFile,zipOutputStream,basedir);
		}
	}
	
	/**
	 * 文件的壓縮方式
	 * @param srcfFile <待壓縮的文件名>
	 * @param zipOutputStream <輸出流>
	 * @param basedir <文件在壓縮文件中的路徑>
	 * @throws IOException
	 */
	private void compressFile(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
		
		if(!srcfFile.exists()){
			return;
		}
		ZipEntry zipEntry = null;
		zipEntry = new ZipEntry(basedir+srcfFile.getName());
		
		FileInputStream fis = new FileInputStream(srcfFile);
		zipOutputStream.putNextEntry(zipEntry);
		int temp;
		byte[] b = new byte[BUFFERSIZE];
		while((temp = fis.read(b))!=-1){
			zipOutputStream.write(b,0,temp);
		}
		fis.close();
	}
	/**
	 * 文件夾的壓縮方式
	 * @param srcfFile
	 * @param zipOutputStream
	 * @param basedir
	 * @throws IOException
	 */
	private void compressDirectory(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
		if(!srcfFile.exists()){
			return;
		}
		File[] files = srcfFile.listFiles();
		//若爲空文件夾
		if(files.length==0)
			zipOutputStream.putNextEntry(new ZipEntry(basedir+srcfFile.getName()+"/"));
	    //非空文件夾繼續遞歸,判斷下一級目錄類型
		for(File file : files){
			compressByType(file, zipOutputStream, basedir+srcfFile.getName()+File.separator);
		}
		
	}
	/**
	 * 解壓縮文件方法
	 * @param zipPath <壓縮文件目錄>
	 * @param outputPath <解壓目錄>
	 * @throws IOException
	 */
	public static void unzipFiles(String zipPath, String outputPath) throws IOException{
		ZipInputStream zis = null;
		ZipEntry zipEntry = null;
		
		zis = new ZipInputStream(new FileInputStream(zipPath));
		while((zipEntry = zis.getNextEntry())!=null){
			//獲取每個zipentry的路徑,創建相應的文件夾
			File path = new File(outputPath + File.separator + zipEntry.getName());
			File parpath = new File(path.getParentFile().getPath());
			if(zipEntry.isDirectory()){
				path.mkdirs();
				continue;
			}else {
				parpath.mkdirs();
			}
			//將文件解壓到相應文件夾下
			FileOutputStream fod = new FileOutputStream(outputPath + File.separator + zipEntry.getName());
			int temp;
			byte[] b = new byte[BUFFERSIZE];
			while((temp=zis.read(b))!=-1){
				fod.write(b,0,temp);
			}
			fod.close();
		}
		zis.close();
		
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章