Zip文件的读取
ZipInputStream的基本用法:
首先要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后循环调用getNextEntry(),当返回值为null时,表示zip流读取结束。
一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法进行读取,当返回值为-1时,读取结束。
代码实现
public class Main {
public static void main(String[] args) {
try (ZipInputStream in = new ZipInputStream(new FileInputStream("C:\\IO流\\Test.zip"),Charset.forName("gbk"))) {
ZipEntry entry = null;
//提取压缩文件中的每个子文件
while((entry = in.getNextEntry())!=null) {
System.out.println(entry.getName());
int data = -1;
while((data = in.read())!= -1){
System.out.println(data);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接下来我们使用ZipInputStream输入流,自己实现一个解压缩功能
功能实现:对一个zip文件进行解压缩
实现步骤:1,创建解压缩目录,获取zip文件的名称,根据zip文件名称,提取压缩目录的名称,创建解压缩目录,随后创建目录。
2,遍历并读取Zip文件中的每个子文件,创建一个缓冲输出流,将Zip文件中读取的文件字节写入新的文件中,需要注意的是:每创建一个输出流,我们都需要手动的将其关闭,当写入的文件字节较少时,会出现缓冲区的字节无法正常写入。
public class Main {
public static void main(String[] args) {
//要进行解压缩的zip文件
File zipFile = new File("C:\\IO流\\Test.zip");
//1.创建解压缩目录
//获取zip文件的名称
String zipFileName = zipFile.getName();
//根据zip文件名称,提取压缩目录的名称
String targetFileName = zipFileName.substring(0,zipFileName.indexOf("."));
//创建解压缩目录
File targetDir = new File(zipFile.getParent() + "\\" + targetFileName);
if(!targetDir.exists()) {
targetDir.mkdir();//创建目录
}
//2.解析读取zip文件
try (
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile),Charset.forName("gbk"))) {
//遍历Zip文件中的每个子文件
ZipEntry zipEntry = null;
while((zipEntry = in.getNextEntry())!=null) {
//获取zip压缩包中的子文件名称
String zipEntryFileName = zipEntry.getName();
//创建该文件的输出流
String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;
//輸出流定义在try()块,结束自动清空缓冲区并关闭
try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath))){ ;
// 读取该子文件的字节内容
byte[] buff = new byte[1024];
int len = -1;
while ((len = in.read(buff)) != -1) {
bos.write(buff, 0, len);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Zip文件的写入
ZipOutputStream是一种FilterOutputStream,它可以直接写入内容到zip包。我们要先创建一个ZipOutputStream,通常是包装一个FileOutStream,然后,没写入一个文件前,先调用putNextEntry( ),然后用write()写入byte[ ]数据,写入完毕后调用closeEntry( ),结束这个文件的打包。
下来我们利用ZipOutputStream输出流实现指定功能:将指定文件写入zip文件
功能实现:将一个文件目录进行压缩。
实现步骤:1,获取并遍历原始目录下的子文件列表。
2,将原始文件的字节内容,写入zip压缩包。
我们在进行zip文件的写入时,需要注意的是写入的zip压缩包应与原始目录在同一父级目录下。
public class Main {
public static void main(String[] args) {
//原始目录
File rootDir = new File("C:\\IO流\\Test");
//将原始目录中的文件,写入zip压缩文件
try ( ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent()+"\\"+rootDir.getName()+".zip"))) {
//获取并遍历原始目录下的子文件列表
File[] files = rootDir.listFiles();
for (File file : files) {
//创建一个ZipEntry
out.putNextEntry(new ZipEntry(file.getName()));
//将原始文件的字节内容,写入zip压缩包
out.write(Files.readAllBytes(file.toPath()));
//结束当前ZipEntry
out.closeEntry();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}