java 内存 zip_Java解压内存InputStream格式的zip文件

Java解压内存InputStream格式的zip文件

Java解压内存InputStream格式的zip文件

Java解压内存InputStream格式的zip文件前提

代码pom.xml

文件工具类FileUtil.java

zip解压工具类

运行

前提

zip文件存在:D:\tmp\mytest.zip。

代码

pom.xml

org.projectlombok

lombok

1.16.20

org.slf4j

slf4j-simple

1.7.25

文件工具类FileUtil.java

package com.ydfind.zip;

import lombok.extern.slf4j.Slf4j;

import java.io.*;

import java.util.Objects;

/**

* 文件操作工具类

*

* @author : ydfind

* @date : 2019-06-06

*/

@Slf4j

public class FileUtil {

public static void writeFile(String path, String str) throws IOException {

try {

File file = new File(path);

createFileIfNotExist(file);

FileOutputStream out = new FileOutputStream(file);

StringBuffer sb = new StringBuffer();

sb.append(str + "\r\n");

out.write(sb.toString().getBytes("utf-8"));

out.close();

} catch(IOException ex) {

throw new IOException("writeFile " + path + " error", ex);

}

}

public static String readFile(String path) throws IOException {

return readFile(path, "utf-8");

}

public static String readFile(String path, String encode) throws IOException {

StringBuffer sb=new StringBuffer();

String tempstr=null;

try {

File file=new File(path);

if(!file.exists()) {

throw new FileNotFoundException();

}

FileInputStream fis=new FileInputStream(file);

BufferedReader br=new BufferedReader(new InputStreamReader(fis, encode));

while((tempstr=br.readLine())!=null) {

sb.append(tempstr + "\r\n");

}

} catch(IOException ex) {

throw new IOException("readFile " + path + " error", ex);

}

return sb.toString();

}

public static void createDirIfNotExist(String path){

File file = new File(path);

createDirIfNotExist(file);

}

public static void createDirIfNotExist(File file){

if(!file.exists()){

file.mkdirs();

}

}

public static void createFileIfNotExist(File file) throws IOException {

createParentDirIfNotExist(file);

file.createNewFile();

}

// public static void createParentDirIfNotExist(String filename){

// File file = new File(filename);

// createParentDirIfNotExist(file);

// }

public static void createParentDirIfNotExist(File file){

createDirIfNotExist(file.getParentFile());

}

public static Boolean isDirEnd(String name){

if(Objects.nonNull(name)){

if(name.endsWith("/") || name.endsWith("\\")) {

return true;

}

}

return false;

}

}

zip解压工具类

主要看法二的解压方法

package com.ydfind.zip;

import lombok.extern.slf4j.Slf4j;

import java.io.*;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import java.util.zip.ZipInputStream;

/**

* zip解压示例

*

* @author : ydfind

* @date : 2019-06-06

*/

@Slf4j

public class ZipUtil {

public static void main(String[] args) throws IOException {

String filename = "D:\\tmp\\mytest.zip";

String path = "D:\\tmp";

// 法一:解压文件

ZipUtil.unZip(filename, path + "\\法1\\");

// 法二:先读到内存,再统一保存

InputStream inputStream = new FileInputStream(filename);

Map map = null;

try {

map = readZipByInputStream(inputStream);

}finally {

try{

inputStream.close();

}catch (Exception e){

log.warn("close FileInputStream exception", e);

}

}

if(map != null) {

for (String name : map.keySet()) {

log.info("法二:写入文件 = {}", path + "\\法2\\" + name);

if(FileUtil.isDirEnd(name)){

FileUtil.createDirIfNotExist(path + "\\法2\\" + name);

}else {

FileUtil.writeFile(path + "\\法2\\" + name, map.get(name));

}

}

}

}

/**

* 从zip的inputStream中读出map

* @param inputStream

* @return

* @throws IOException

*/

public static Map readZipByInputStream(InputStream inputStream) throws IOException {

Map map = new HashMap();

ZipInputStream zip;

zip = new ZipInputStream(inputStream);

ZipEntry zipEntry = null;

while((zipEntry = zip.getNextEntry()) != null){

String filename = zipEntry.getName();

if(zipEntry.isDirectory()){

if(FileUtil.isDirEnd(filename)) {

filename += "\\";

}

}

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

byte[] byteTemp = new byte[1024];

int num = -1;

while((num = zip.read(byteTemp,0,byteTemp.length))>-1){

byteArrayOutputStream.write(byteTemp,0,num);

}

byte[] bytes = byteArrayOutputStream.toByteArray();

String content = new String(bytes,"UTF-8");

map.put(filename, content);

}

return map;

}

public static void unZip(String sourceFilename, String targetDir) throws IOException {

unZip(new File(sourceFilename), targetDir);

}

/**

* 将sourceFile解压到targetDir

* @param sourceFile

* @param targetDir

* @throws RuntimeException

*/

public static void unZip(File sourceFile, String targetDir) throws IOException {

long start = System.currentTimeMillis();

if (!sourceFile.exists()) {

throw new FileNotFoundException("cannot find the file = " + sourceFile.getPath());

}

ZipFile zipFile = null;

try{

zipFile = new ZipFile(sourceFile);

Enumeration> entries = zipFile.entries();

while (entries.hasMoreElements()) {

ZipEntry entry = (ZipEntry) entries.nextElement();

if (entry.isDirectory()) {

String dirPath = targetDir + "/" + entry.getName();

FileUtil.createDirIfNotExist(dirPath);

} else {

File targetFile = new File(targetDir + "/" + entry.getName());

FileUtil.createFileIfNotExist(targetFile);

InputStream is = null;

FileOutputStream fos = null;

try {

is = zipFile.getInputStream(entry);

fos = new FileOutputStream(targetFile);

int len;

byte[] buf = new byte[1024];

while ((len = is.read(buf)) != -1) {

fos.write(buf, 0, len);

}

}finally {

try{

fos.close();

}catch (Exception e){

log.warn("close FileOutputStream exception", e);

}

try{

is.close();

}catch (Exception e){

log.warn("close InputStream exception", e);

}

}

}

}

log.info("解压完成,耗时:" + (System.currentTimeMillis() - start) +" ms");

} finally {

if(zipFile != null){

try {

zipFile.close();

} catch (IOException e) {

log.warn("close zipFile exception", e);

}

}

}

}

}

运行

运行ZipUtil的main函数,结果如下,可以看到两种解压方法都是相等的。

563027340d2375fb401c78b87aed2eaf.png

3a2f25610a36b560750e7aa4a8eec4f6.png

Java解压内存InputStream格式的zip文件相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值