一、文件的压缩流和解压流
1、为什么需要使用压缩文件
文件压缩使用场景: 在文件上传或下载中需要操作多个文件时,如果一个一个复制需要花较长时间,而且比较繁琐,javaAPI提供一种压缩/解压文件方式,可以将多个文件打包成一个文件(.zip)
包: java.util.zip
常用类: ZipEntry: 表示压缩文件中的每一个实体文件
ZipFile: 表示压缩文件对象
ZipOutputStream: 表示压缩文件输出流,用于将普通文件写出到zip文件中
ZipInputStream: 表示解压文件的输入流,用于读zip文件中的每一个实体ZipEntry
这里的abcd.txt就是一个ZipEntry
2、压缩文件步骤
a、创建需要压缩文件的输入流(InputStream )
b、创建压缩包所在的路径,并指定压缩文件名,同时创建ZipOutputStream输出流
c、将文件对象 添加到 ZipOutputStream中的实体中(也可以指定压缩后的实体名称)
d、文件复制
e、关闭流
public static void main(String[] args) throws IOException {
// 1、创建文件对象
File file = new File("d:/小众网站.txt");
// 2、创建文件的输入流
FileInputStream fis = new FileInputStream(file);
// 3、创建文件压缩流(输出流)
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("d:/myfile.zip"));
// 给压缩包中添加文件,并可自定义文件名
zos.putNextEntry(new ZipEntry("小众网站.txt "));
// 给压缩包设置注释
zos.setComment("这是压缩包的注释。。。。");
// 文件复制
int len = 0;
byte [] b = new byte[1024];
while( (len = fis.read(b)) !=-1){
zos.write(b,0,len);
}
System.out.println("文件压缩成功");
zos.close();
fis.close();
}
压缩多个文件
/**
* 压缩一个文件夹 myfile
* @param args
*/
public static void main(String[] args) throws IOException {
//构建压缩包的输出流
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("d:/myfile.zip"));
File file=new File("d:/myfile");
File [] files = file.listFiles();
for(File f : files){
//构造每一个文件的输入流
FileInputStream fis = new FileInputStream(f);
putZipFile(fis, zos ,f.getName());
System.out.println(f.getName()+"文件压缩成功" );
}
//关闭压缩流
zos.flush();
zos.close();
}
/**
* 将文件放入压缩流中
* @param fis
* @param zos
* @param entryName
* @throws IOException
*/
public static void putZipFile(InputStream fis ,
ZipOutputStream zos,
String entryName) throws IOException {
// 给压缩包中添加文件,并可自定义文件名
zos.putNextEntry(new ZipEntry(entryName));
// 给压缩包设置注释
zos.setComment("这是压缩包的注释。。。。");
// 文件复制
int len = 0;
byte [] b = new byte[1024];
while( (len = fis.read(b)) !=-1){
zos.write(b,0,len);
}
System.out.println("文件压缩成功");
fis.close();
}
3、解压文件步骤
解压文件是将一个.zip文件的内容,复制到文件下,需要使用ZipInputStream
解压文件的关键点: 获取解压文件的每一个条目ZipEntry的输入流 ,将输入流写出到指定位置。
如何获取输入流: ZipFile对象 表示一个zip文件
步骤:
a、根据文件路径 创建ZipInputStream
b、根据文件路径创建ZipFile对象
c、循环遍历每一天条目, 得到它的ZipEntry
d、获取ZipEntry的输入流
e、将文件复制到指定位置
public static void main(String[] args) throws IOException {
//1、创建ZipInputStream
ZipInputStream zis = new ZipInputStream(
new FileInputStream("d:/myfile.zip"));
// 2、创建ZipFile对象
ZipFile zipFile = new ZipFile("d:/myfile.zip");
// 3、获取zip中的实体
ZipEntry en = null;
while( (en= zis.getNextEntry())!=null){
System.out.println(en.getName()+"--"+en.isDirectory());
//4、获取每一个en的输入流 (关键)
InputStream is = zipFile.getInputStream(en);
copyFile(is ,"d:/my",en.getName());
}
}
/**
* 通过输入流 复制文件到指定的目录下
* @param is 输入流
* @param path 存放文件的路径
* @param fileName 文件名
*/
public static void copyFile(InputStream is , String path , String fileName) throws IOException {
File file = new File(path);
//判断目录是否存在, 不存在就 创建
if(!file.exists()){
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(path+File.separator+fileName);
int len = 0 ;
byte [] b = new byte[1024];
while( (len = is.read(b)) !=-1){
fos.write(b,0,len);
}
System.out.println("解压成功");
fos.close();
is.close();
}