您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第12章:JAVA IO】_压缩流
发布时间:2020-12-30 15:37:36编辑:雪饮阅读()
用压缩流实现一个简单的文件压缩(zip)
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
//待压缩文件
File file=new File("d:"+File.separator+"kasumi.txt");
//压缩之后文件
File zipFile=new File("d:"+File.separator+"kasumi.zip");
//待压缩文件输入流
InputStream input=new FileInputStream(file);
//压缩之后文件输出流
ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
//设置压缩实体
zipOut.putNextEntry(new ZipEntry(file.getName()));
//设置压缩备注
zipOut.setComment("www.kasumi.com");
int temp=0;
while((temp=input.read())!=-1){
zipOut.write(temp);
}
input.close();
zipOut.close();
}
};
需要说明下压缩实体就是压缩文件内部的压缩主体。如果是压缩文件夹,则压缩实体就是文件夹
文件夹压缩
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
//待压缩文件夹
File file=new File("d:"+File.separator+"kasumi");
//压缩之后文件
File zipFile=new File("d:"+File.separator+"kasumi.zip");
//压缩之后文件输出流
ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
//设置压缩备注
zipOut.setComment("www.kasumi.com");
int temp=0;
if(file.isDirectory()){
File lists[]=file.listFiles();
for(int i=0;i<lists.length;i++){
//待压缩文件输入流
InputStream input=new FileInputStream(lists[i]);
//设置压缩实体
zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+lists[i].getName()));
while((temp=input.read())!=-1){
zipOut.write(temp);
}
input.close();
}
}
zipOut.close();
}
};
D:\>javac Hello.java
D:\>java Hello
对于压缩文件夹这个程序,会发现该文件夹压缩后的压缩包通过压缩工具打开后里面是一个文件夹,而再次点击进入该文件夹才能看到具体的文件列表。那么如果想要压缩文件夹的结果仅仅是压缩文件的名称是文件夹名称,而里面的结构直达文件列表,则只要稍微调整下代码即可。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
//待压缩文件夹
File file=new File("d:"+File.separator+"kasumi");
//压缩之后文件
File zipFile=new File("d:"+File.separator+"kasumi.zip");
//压缩之后文件输出流
ZipOutputStream zipOut=new ZipOutputStream(new FileOutputStream(zipFile));
//设置压缩备注
zipOut.setComment("www.kasumi.com");
int temp=0;
if(file.isDirectory()){
File lists[]=file.listFiles();
for(int i=0;i<lists.length;i++){
//待压缩文件输入流
InputStream input=new FileInputStream(lists[i]);
//设置压缩实体
zipOut.putNextEntry(new ZipEntry(lists[i].getName()));
while((temp=input.read())!=-1){
zipOut.write(temp);
}
input.close();
}
}
zipOut.close();
}
};
获取压缩文件的文件名称
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipFile;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
File file=new File("d:"+File.separator+"kasumi.zip");
ZipFile zipFile=new ZipFile(file);
System.out.println("压缩文件的名称:"+zipFile.getName());
}
};
D:\>javac Hello.java
D:\>java Hello
压缩文件的名称:d:\kasumi.zip
莫名的感觉这个有点鸡肋呢。可能是应用场景还没有找到吧。
文件解压(从压缩包中提取一个文件)的实现
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipFile;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
//准备压缩包中待解压(提取)文件输入流
File file=new File("d:"+File.separator+"kasumi.zip");
ZipFile zipFile=new ZipFile(file);
ZipEntry entry=zipFile.getEntry("kasumi.txt");
InputStream input = zipFile.getInputStream(entry);
//准备待提取文件从压缩包中提取之后的输出流
File outputFile=new File("d:"+File.separator+"kasumi_unzip.txt");
OutputStream out=new FileOutputStream(outputFile);
//提取
int temp=0;
while((temp=input.read())!=-1){
out.write(temp);
}
input.close();
out.close();
}
};
D:\>javac Hello.java
D:\>java Hello
D:\>type kasumi_unzip.txt
my name is kasumi
获取压缩包内压缩实体名称
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Hello{
public static void main(String args[]) throws Exception{
File zipFile=new File("d:"+File.separator+"kasumi.zip");
ZipInputStream input=new ZipInputStream(new FileInputStream(zipFile));
ZipEntry entry=input.getNextEntry();
System.out.println("压缩实体名称:"+entry.getName());
entry=input.getNextEntry();
System.out.println("压缩实体名称:"+entry.getName());
input.close();
}
};
D:\>javac Hello.java
D:\>java Hello
压缩实体名称:kasumi.txt
压缩实体名称:kasumi.zip
从结果看来,获取压缩实体名称会导致压缩实体列表的游标下滑。
则基于此可以实现把整个压缩包内的压缩实体都遍历出来。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Hello{
public static void main(String args[]) throws Exception{
File zipFile=new File("d:"+File.separator+"kasumi.zip");
ZipInputStream input=new ZipInputStream(new FileInputStream(zipFile));
ZipEntry entry=null;
while((entry=input.getNextEntry())!=null){
System.out.println("压缩实体名称:"+entry.getName());
}
input.close();
}
};
D:\>javac Hello.java
D:\>java Hello
压缩实体名称:kasumi.txt
压缩实体名称:kasumi.zip
压缩实体名称:kasumi1.txt
压缩实体名称:kasumi2.txt
文件解压的实现
import java.io.File;
import java.io.OutputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Hello{
public static void main(String args[]) throws Exception{
//准备待解压文件输入流
File file = new File("d:" + File.separator + "kasumi.zip");
ZipFile zipFile = new ZipFile(file);
ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file));
//从待解压文件输入流中遍历压缩包内部所有实体的输入输出流进行解压
ZipEntry entry = null ;
while((entry = zipInput.getNextEntry())!=null){
System.out.println("解压缩" + entry.getName() + "文件。");
File outFile = new File("d:" + File.separator + "kasumi"+File.separator+entry.getName());
//文件的父级(所属目录)不存在时候自动创建
if(!outFile.getParentFile().exists()){
outFile.getParentFile().mkdir() ;
}
if(!outFile.exists()){
outFile.createNewFile();
}
InputStream input = zipFile.getInputStream(entry);
OutputStream out = new FileOutputStream(outFile);
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp);
}
input.close();
out.close();
}
}
};
D:\>javac Hello.java
D:\>java Hello
解压缩kasumi.txt文件。
解压缩kasumi.zip文件。
解压缩kasumi1.txt文件。
解压缩kasumi2.txt文件。
关键字词:java,压缩流