add method

This commit is contained in:
Looly 2021-09-06 17:59:01 +08:00
parent 22da196cd4
commit 36cf627f3d
3 changed files with 52 additions and 18 deletions

View File

@ -13,6 +13,7 @@
* 【setting】 Setting、Props持有URL改为持有Resourcepr#1182@Github * 【setting】 Setting、Props持有URL改为持有Resourcepr#1182@Github
* 【json 】 JSONUtil.toJsonStr增加重载支持JSONConfigissue#I48H5L@Gitee * 【json 】 JSONUtil.toJsonStr增加重载支持JSONConfigissue#I48H5L@Gitee
* 【crypto 】 SymmetricCrypto增加setMode方法update采用累加模式pr#1642@Github * 【crypto 】 SymmetricCrypto增加setMode方法update采用累加模式pr#1642@Github
* 【core 】 ZipReader支持Filter
### 🐞Bug修复 ### 🐞Bug修复
* 【core 】 修复ListUtil.split方法越界问题issue#I48Q0P@Gitee * 【core 】 修复ListUtil.split方法越界问题issue#I48Q0P@Gitee

View File

@ -3,6 +3,7 @@ package cn.hutool.core.compress;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Filter;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import java.io.Closeable; import java.io.Closeable;
@ -71,7 +72,7 @@ public class ZipReader implements Closeable {
/** /**
* 构造 * 构造
* *
* @param in 读取的的Zip文件流 * @param in 读取的的Zip文件流
* @param charset 编码 * @param charset 编码
*/ */
public ZipReader(InputStream in, Charset charset) { public ZipReader(InputStream in, Charset charset) {
@ -88,7 +89,8 @@ public class ZipReader implements Closeable {
} }
/** /**
* 获取指定路径的文件流 * 获取指定路径的文件流<br>
* 如果是文件模式则直接获取Entry对应的流如果是流模式则遍历entry后找到对应流返回
* *
* @param path 路径 * @param path 路径
* @return 文件流 * @return 文件流
@ -101,7 +103,17 @@ public class ZipReader implements Closeable {
return ZipUtil.getStream(zipFile, entry); return ZipUtil.getStream(zipFile, entry);
} }
} else { } else {
throw new UnsupportedOperationException("Zip stream mode not support get!"); try {
this.in.reset();
ZipEntry zipEntry;
while (null != (zipEntry = in.getNextEntry())) {
if(zipEntry.getName().equals(path)){
return this.in;
}
}
} catch (IOException e) {
throw new IORuntimeException(e);
}
} }
return null; return null;
@ -115,22 +127,37 @@ public class ZipReader implements Closeable {
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
*/ */
public File readTo(File outFile) throws IORuntimeException { public File readTo(File outFile) throws IORuntimeException {
return readTo(outFile, null);
}
/**
* 解压到指定目录中
*
* @param outFile 解压到的目录
* @param entryFilter 过滤器排除不需要的文件
* @return 解压的目录
* @throws IORuntimeException IO异常
* @since 5.7.12
*/
public File readTo(File outFile, Filter<ZipEntry> entryFilter) throws IORuntimeException {
read((zipEntry) -> { read((zipEntry) -> {
// FileUtil.file会检查slip漏洞漏洞说明见http://blog.nsfocus.net/zip-slip-2/ if (null == entryFilter || entryFilter.accept(zipEntry)) {
File outItemFile = FileUtil.file(outFile, zipEntry.getName()); // FileUtil.file会检查slip漏洞漏洞说明见http://blog.nsfocus.net/zip-slip-2/
if (zipEntry.isDirectory()) { final File outItemFile = FileUtil.file(outFile, zipEntry.getName());
// 目录 if (zipEntry.isDirectory()) {
//noinspection ResultOfMethodCallIgnored // 目录
outItemFile.mkdirs(); //noinspection ResultOfMethodCallIgnored
} else { outItemFile.mkdirs();
InputStream in;
if (null != this.zipFile) {
in = ZipUtil.getStream(this.zipFile, zipEntry);
} else { } else {
in = this.in; InputStream in;
if (null != this.zipFile) {
in = ZipUtil.getStream(this.zipFile, zipEntry);
} else {
in = this.in;
}
// 文件
FileUtil.writeFromStream(in, outItemFile, false);
} }
// 文件
FileUtil.writeFromStream(in, outItemFile, false);
} }
}); });
return outFile; return outFile;
@ -140,8 +167,8 @@ public class ZipReader implements Closeable {
* 读取并处理Zip文件中的每一个{@link ZipEntry} * 读取并处理Zip文件中的每一个{@link ZipEntry}
* *
* @param consumer {@link ZipEntry}处理器 * @param consumer {@link ZipEntry}处理器
* @throws IORuntimeException IO异常
* @return this * @return this
* @throws IORuntimeException IO异常
*/ */
public ZipReader read(Consumer<ZipEntry> consumer) throws IORuntimeException { public ZipReader read(Consumer<ZipEntry> consumer) throws IORuntimeException {
if (null != this.zipFile) { if (null != this.zipFile) {
@ -154,7 +181,7 @@ public class ZipReader implements Closeable {
@Override @Override
public void close() throws IORuntimeException { public void close() throws IORuntimeException {
if(null != this.zipFile){ if (null != this.zipFile) {
IoUtil.close(this.zipFile); IoUtil.close(this.zipFile);
} else { } else {
IoUtil.close(this.in); IoUtil.close(this.in);

View File

@ -92,5 +92,11 @@ public class Base64Test {
@Test @Test
public void decodeEmojiTest(){ public void decodeEmojiTest(){
String str = "😄";
final String encode = Base64.encode(str);
// Console.log(encode);
final String decodeStr = Base64.decodeStr(encode);
Assert.assertEquals(str, decodeStr);
} }
} }