本文實例通過Java的Zip輸入輸出流實現壓縮和解壓文件,前一部分代碼實現獲取文件路徑,壓縮文件名的更改等,具體如下:
package com.utility.zip;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;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;import com.utility.io.IOUtil;/** * 通過Java的Zip輸入輸出流實現壓縮和解壓文件* * @author liujiduo * */public final class ZipUtil {private ZipUtil() {// empty}/** * 壓縮文件* * @param filePath * 待壓縮的文件路徑* @return 壓縮後的文件*/public static File zip(String filePath) {File target = null;File source = new File(filePath);if (source.exists()) {// 壓縮文件名=源文件名.zipString zipName = source.getName() + ".zip";target = new File(source.getParent(), zipName);if (target.exists()) {target.delete();// 刪除舊的文件}FileOutputStream fos = null;ZipOutputStream zos = null;try {fos = new FileOutputStream(target);zos = new ZipOutputStream(new BufferedOutputStream(fos));// 添加對應的文件EntryaddEntry("/", source, zos);}catch (IOException e) {throw new RuntimeException(e);}finally {IOUtil.closeQuietly(zos, fos);}}return target;}/** * 掃描添加文件Entry * * @param base * 基路徑* * @param source * 源文件* @param zos * Zip文件輸出流* @throws IOException */private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {// 按目錄分級,形如:/aaa/bbb.txtString entry = base + source.getName();if (source.isDirectory()) {for (File file : source.listFiles()) {// 遞歸列出目錄下的所有文件,添加文件EntryaddEntry(entry + "/", file, zos);}} else {FileInputStream fis = null;BufferedInputStream bis = null;try {byte[] buffer = new byte[1024 * 10];fis = new FileInputStream(source);bis = new BufferedInputStream(fis, buffer.length);int read = 0;zos.putNextEntry(new ZipEntry(entry));while ((read = bis.read(buffer, 0, buffer.length)) != -1) {zos.write(buffer, 0, read);}zos.closeEntry();}finally {IOUtil.closeQuietly(bis, fis);}}}/** * 解壓文件* * @param filePath * 壓縮文件路徑*/public static void unzip(String filePath) {File source = new File(filePath);if (source.exists()) {ZipInputStream zis = null;BufferedOutputStream bos = null;try {zis = new ZipInputStream(new FileInputStream(source));ZipEntry entry = null;while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {File target = new File(source.getParent(), entry.getName());if (!target.getParentFile().exists()) {// 創建文件父目錄target.getParentFile().mkdirs();}// 寫入文件bos = new BufferedOutputStream(new FileOutputStream(target));int read = 0;byte[] buffer = new byte[1024 * 10];while ((read = zis.read(buffer, 0, buffer.length)) != -1) {bos.write(buffer, 0, read);}bos.flush();}zis.closeEntry();}catch (IOException e) {throw new RuntimeException(e);}finally {IOUtil.closeQuietly(zis, bos);}}}public static void main(String[] args) {String targetPath = "E://Win7壁紙";File file = ZipUtil.zip(targetPath);System.out.println(file);ZipUtil.unzip("F://Win7壁紙.zip");}}下面是通過IO流工具類實現關閉一個或多個流對象的Java語言描述,獲取可關閉的流對象列表,具體如下:
package com.utility.io;import java.io.Closeable;import java.io.IOException;/** * IO流工具類* * @author liujiduo * */public class IOUtil {/** * 關閉一個或多個流對象* * @param closeables * 可關閉的流對象列表* @throws IOException */public static void close(Closeable... closeables) throws IOException {if (closeables != null) {for (Closeable closeable : closeables) {if (closeable != null) {closeable.close();}}}}/** * 關閉一個或多個流對象* * @param closeables * 可關閉的流對象列表*/public static void closeQuietly(Closeable... closeables) {try {close(closeables);}catch (IOException e) {// do nothing}}}總結
以上就是本文關於Java壓縮文件工具類ZipUtil使用方法代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。