package 文件压缩.本地文件压缩到本地;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 本地文件(夹)——————》压缩并保存在本地
*/
public class test1 {
public static void main(String[] args) {
compression("D:\\test_zip_c+++++.zip", new File("D:\\c+++++"));
}
/**
* resultFileName 被压缩的文件会变成一个新的文件,也就是结果,这个结果的文件名叫 resultFileName
* compressedFile 被压缩的文件
*/
public static void compression(String 压缩后文件的完整地址, File 被压缩的文件的完整地址) {
/*压缩 D:\c+++++ 这个文件夹成 D:\test_zip_c+++++.zip 文件*/
System.out.println("正在压缩中、、、");
try {
/*压缩文件 输出流 首先:输出之后的文件名是什么,所以要传入一个FileOutputStream(压缩后文件的完整地址,就是例如c:/user/ss/321.zip)*/
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(压缩后文件的完整地址));
/*但是为了提高效率 一般不直接用压缩文件流本身,而是将其封装在BufferedOutputStream里面,所以,out流的写都是buffer在.write,而不是zipoutxxx.write*/
BufferedOutputStream bos = new BufferedOutputStream(zipOutputStream);
zip(zipOutputStream, 被压缩的文件的完整地址, 被压缩的文件的完整地址.getName(), bos);
bos.close();
zipOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
}
System.out.println("压缩完成、、、");
}
/*zip压缩*/
private static void zip(ZipOutputStream zipOutputStream, File 被压缩的文件的完整地址, String 被压缩的文件文件名, BufferedOutputStream bos) throws IOException {
/*如果是目录*/
if (被压缩的文件的完整地址.isDirectory()) {
File[] files = 被压缩的文件的完整地址.listFiles();
if (files.length == 0) {
zipOutputStream.putNextEntry(new ZipEntry(被压缩的文件文件名 + "/"));
}
for (File file : files) {
/*递归处理*/
zip(zipOutputStream, file, 被压缩的文件文件名 + "/" + file.getName(), bos);
}
}
/*如果不是目录*/
else {
/*向压缩流中添加一个单元*/
zipOutputStream.putNextEntry(new ZipEntry(被压缩的文件文件名));
/*将文件转换成流读入内存*/
InputStream inputStream = new FileInputStream(被压缩的文件的完整地址);
/*同样的道理,为了提高速度,一般都是封装在 BufferedInputStream 里面,所以read一般也不是 input.read 而是bufferinput在.read*/
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] bytes = new byte[1024];
int len = -1;
/*bufferedInputStream.read(bytes)的意思是,一次性读取流中的数据然后放入 byte[1024] 中*/
while ((len = bufferedInputStream.read(bytes)) != -1) {
/*写数据也是,从 buyes中拿数据 去写 */
bos.write(bytes, 0, len);
}
bufferedInputStream.close();
}
}
}
Java实现:本地文件(夹) ————> 本地压缩包
于 2022-08-17 15:44:04 首次发布