2020-07-12

Java压缩文件工具代码,实现文件和文件夹的压缩,空文件夹也可以被压缩,但二级空文件夹无法被压缩。
大家好,这是我写的第二篇博客,我利用业余时间学Java,现在已经3个月了,由于我用的书上的代码有bug,所以我自己写了一个程序,源代码如下:
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.ZipOutputStream;

public class Demo {
static void compress() {
File source = new File(“C:\Users\15162\Desktop\hell\”); // 源文件
File target = new File(“C:\Users\15162\Desktop\blabla.rar”); // 壓縮包

	try (FileOutputStream fos = new FileOutputStream(target); ZipOutputStream zos = new ZipOutputStream(fos)) {

		if (source.isDirectory()) {
			for (File f : source.listFiles()) {
				System.out.print("源文件下的文件路經是:  " + f + "    ");
				addEntry(zos, "", f); 
			}

		} else {
			addEntry(zos, "", source);
		}
	} catch (Exception e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
	}
	System.out.println("\n" + "compressing");

}

/**
 * 
 * @param zos-壓縮流
 * @param base-文件在壓縮包中的路徑
 * @param source-被壓縮的文件
 */
static void addEntry(ZipOutputStream zos, String base, File source) {
	if (source.isDirectory()) {
		// File f[] = source.listFiles();
		// for(File x : f) {
		// System.out.println(x);
		// }		
		File f[] = source.listFiles();
		if (f.length > 0) {
			for (File file : source.listFiles()) {

				addEntry(zos, base + source.getName() + File.separator, file);
			}
		} else {
			try {
				zos.putNextEntry(new ZipEntry(source.getName() + "/")); // 此語句用來寫入空文件夾,但無法寫入二級空文件夾
				System.out.println("此時空文件夾的條目為:"+ source.getName() + "/");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	} else {
		byte buf[] = new byte[1024];
		try (FileInputStream fis = new FileInputStream(source)) {

			int count;
			// 在压缩包中添加新条目
			zos.putNextEntry(new ZipEntry(base + source.getName()));
			System.out.println("base為: " + base + "   source的名稱為:" + source.getName() + "  source的絕對路徑為:" + source);
			while ((count = fis.read(buf)) != -1) {
				zos.write(buf, 0, count);
				zos.flush();
			}
			zos.closeEntry(); // 关闭条目
			fis.close();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}
}

public static void main(String[] args) {

	compress();
	System.out.println("compressed");
}

}

你可能感兴趣的:(笔记)