java解压zip
目前有个需求,需要解压zip包,怎么做呢,我也不知道,先百度。
然后我发现了java.util.zip这个包,java自带这个包有没有!!百度上面虽然都是片段代码但是我顺藤摸瓜找到了java.util.zip。那么我们来看看这个目录的结构
然后找到了这个文章
https://blog.csdn.net/revivedsun/article/details/68932128
如果要看压缩的这个文章是很好的选择。
话不多说我根据上面的文章,我推断出大概的解压思路,并做了个demo。
思路:
获取zip文件里面的文件目录和文件信息,获取文件的流,然后通过File类创建并写入流就能实现解压了。
下面demo的使用
在D盘创建一个正常的full.zip文件就可以直接解压到d:/code这个目录下面。
然后运行下面的main方法可以解压zip文件了。
对于File相关的方法不懂的可以看这篇
https://blog.csdn.net/arios171/article/details/81097636
public class HeHe {
public static void main(String[] args) {
File parent = new File("d:/code");
try {
//也就是说这个文件后缀是不是zip
ZipFile zipFile = new ZipFile("d:/full.zip");
System.out.println(zipFile.stream());
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
File file = new File(parent, zipEntry.getName());
if (zipEntry.isDirectory()) {
mkdirs(file);
} else {
createFile(file);
InputStream is = zipFile.getInputStream(zipEntry);
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
}
System.out.println(zipEntry.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件
*
* @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
*/
public static void createFile(String path) {
createFile(new File(path));
}
/**
* 创建文件
*
* @param file file类
*/
private static void createFile(File file) {
if (file.exists() && file.isFile()) {
file.delete();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
File parentFile = file.getParentFile();
if (parentFile.exists()) {
if (parentFile.isFile()) {
parentFile.delete();
parentFile.mkdirs();
}
} else {
parentFile.mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件夹
*
* @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
* @return 如果本来就存在或者创建成功,那么就返回true
*/
public static void mkdirs(String path) {
mkdirs(new File(path));
}
/**
* 创建文件夹
*
* @param file file类
*/
public static void mkdirs(File file) {
if (file.exists() && file.isDirectory()) {
return;
}
if (file.exists()) {
file.delete();
file.mkdirs();
} else {
file.mkdirs();
}
}
}
效果图:
然后我给大家整理了下上面的代码作为工具,使用方法很简单,decompressed是解压,三个方法根据自己的需求使用,已经在安卓系统上试过了,没有任何问题可以使用,java跨平台。
public class ZipUtils {
/**
* 解压方法
*
* @param parent 解压到目录下
* @param zip zip文件
*/
public static void decompressed(String parent, String zip) {
try {
decompressed(new File(parent), new ZipFile(zip));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 解压方法
*
* @param parent 解压到目录下
* @param zip zip文件
*/
public static void decompressed(File parent, File zip) {
try {
decompressed(parent, new ZipFile(zip));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 解压方法
*
* @param parent 解压到目录下
* @param zipFile zip文件
*/
public static void decompressed(File parent, ZipFile zipFile) {
mkdirs(parent);
try {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
File file = new File(parent, zipEntry.getName());
if (zipEntry.isDirectory()) {
mkdirs(file);
} else {
createFile(file);
InputStream is = zipFile.getInputStream(zipEntry);
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件顺便创建父目录
*
* @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
*/
public static void createFile(String path) {
createFile(new File(path));
}
/**
* 创建文件顺便创建父目录
*
* @param file file类
*/
public static void createFile(File file) {
if (file.exists() && file.isFile()) {
file.delete();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
File parentFile = file.getParentFile();
if (parentFile.exists()) {
if (parentFile.isFile()) {
parentFile.delete();
parentFile.mkdirs();
}
} else {
parentFile.mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件夹顺便创建父目录
*
* @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
* @return 如果本来就存在或者创建成功,那么就返回true
*/
public static void mkdirs(String path) {
mkdirs(new File(path));
}
/**
* 创建文件夹顺便创建父目录
*
* @param file file类
*/
public static void mkdirs(File file) {
if (file.exists() && file.isDirectory()) {
return;
}
if (file.exists()) {//肯定是文件了,文件删掉
file.delete();
file.mkdirs();
} else {
file.mkdirs();
}
}
}