fix Date and Zip bugs

This commit is contained in:
Looly
2019-11-16 05:13:25 +08:00
parent 1857e1d062
commit 3ed5ab2515
3 changed files with 159 additions and 135 deletions

View File

@@ -8,6 +8,8 @@
### 新特性 ### 新特性
### Bug修复 ### Bug修复
* 【core】 修复DateUtil.format使用DateTime时区失效问题issue#I150I7@Gitee
* 【core】 修复ZipUtil解压目录遗留问题issue#I14NO3@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@@ -30,6 +30,7 @@ import java.util.GregorianCalendar;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@@ -524,7 +525,15 @@ public class DateUtil {
if (null == date || StrUtil.isBlank(format)) { if (null == date || StrUtil.isBlank(format)) {
return null; return null;
} }
return format(date, FastDateFormat.getInstance(format));
final SimpleDateFormat sdf = new SimpleDateFormat(format);
if(date instanceof DateTime){
final TimeZone timeZone = ((DateTime) date).getTimeZone();
if(null != timeZone) {
sdf.setTimeZone(timeZone);
}
}
return format(date, sdf);
} }
/** /**

View File

@@ -34,13 +34,14 @@ import cn.hutool.core.io.IoUtil;
* 压缩工具类 * 压缩工具类
* *
* @author Looly * @author Looly
*
*/ */
public class ZipUtil { public class ZipUtil {
private static final int DEFAULT_BYTE_ARRAY_LENGTH = 32; private static final int DEFAULT_BYTE_ARRAY_LENGTH = 32;
/** 默认编码,使用平台相关编码 */ /**
* 默认编码,使用平台相关编码
*/
private static final Charset DEFAULT_CHARSET = CharsetUtil.defaultCharset(); private static final Charset DEFAULT_CHARSET = CharsetUtil.defaultCharset();
/** /**
@@ -107,8 +108,8 @@ public class ZipUtil {
/** /**
* 对文件或文件目录进行压缩<br> * 对文件或文件目录进行压缩<br>
* *
* @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 * @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径
* @param zipPath 压缩文件保存的路径包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipPath 压缩文件保存的路径包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param withSrcDir 是否包含被打包目录 * @param withSrcDir 是否包含被打包目录
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -120,9 +121,9 @@ public class ZipUtil {
/** /**
* 对文件或文件目录进行压缩<br> * 对文件或文件目录进行压缩<br>
* *
* @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 * @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径
* @param zipPath 压缩文件保存的路径包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipPath 压缩文件保存的路径包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param charset 编码 * @param charset 编码
* @param withSrcDir 是否包含被打包目录 * @param withSrcDir 是否包含被打包目录
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -138,9 +139,9 @@ public class ZipUtil {
* 对文件或文件目录进行压缩<br> * 对文件或文件目录进行压缩<br>
* 使用默认UTF-8编码 * 使用默认UTF-8编码
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩 * @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩
* @param srcFiles 要压缩的源文件或目录。 * @param srcFiles 要压缩的源文件或目录。
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
@@ -151,10 +152,10 @@ public class ZipUtil {
/** /**
* 对文件或文件目录进行压缩 * 对文件或文件目录进行压缩
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param charset 编码 * @param charset 编码
* @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩 * @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩
* @param srcFiles 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 * @param srcFiles 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
@@ -165,11 +166,11 @@ public class ZipUtil {
/** /**
* 对文件或文件目录进行压缩 * 对文件或文件目录进行压缩
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param charset 编码 * @param charset 编码
* @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩 * @param withSrcDir 是否包含被打包目录只针对压缩目录有效。若为false则只压缩目录下的文件或目录为true则将本目录也压缩
* @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩) * @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩)
* @param srcFiles 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 * @param srcFiles 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 4.6.5 * @since 4.6.5
@@ -203,8 +204,8 @@ public class ZipUtil {
* 对流中的数据加入到压缩文件使用默认UTF-8编码 * 对流中的数据加入到压缩文件使用默认UTF-8编码
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param path 流数据在压缩文件中的路径或文件名 * @param path 流数据在压缩文件中的路径或文件名
* @param data 要压缩的数据 * @param data 要压缩的数据
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 3.0.6 * @since 3.0.6
@@ -217,8 +218,8 @@ public class ZipUtil {
* 对流中的数据加入到压缩文件<br> * 对流中的数据加入到压缩文件<br>
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param path 流数据在压缩文件中的路径或文件名 * @param path 流数据在压缩文件中的路径或文件名
* @param data 要压缩的数据 * @param data 要压缩的数据
* @param charset 编码 * @param charset 编码
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -233,8 +234,8 @@ public class ZipUtil {
* 使用默认编码UTF-8 * 使用默认编码UTF-8
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param path 流数据在压缩文件中的路径或文件名 * @param path 流数据在压缩文件中的路径或文件名
* @param in 要压缩的源 * @param in 要压缩的源
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 3.0.6 * @since 3.0.6
@@ -247,15 +248,15 @@ public class ZipUtil {
* 对流中的数据加入到压缩文件 * 对流中的数据加入到压缩文件
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param path 流数据在压缩文件中的路径或文件名 * @param path 流数据在压缩文件中的路径或文件名
* @param in 要压缩的源,默认关闭 * @param in 要压缩的源,默认关闭
* @param charset 编码 * @param charset 编码
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 3.2.2 * @since 3.2.2
*/ */
public static File zip(File zipFile, String path, InputStream in, Charset charset) throws UtilException { public static File zip(File zipFile, String path, InputStream in, Charset charset) throws UtilException {
return zip(zipFile, new String[] { path }, new InputStream[] { in }, charset); return zip(zipFile, new String[]{path}, new InputStream[]{in}, charset);
} }
/** /**
@@ -263,8 +264,8 @@ public class ZipUtil {
* 路径列表和流列表长度必须一致 * 路径列表和流列表长度必须一致
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param paths 流数据在压缩文件中的路径或文件名 * @param paths 流数据在压缩文件中的路径或文件名
* @param ins 要压缩的源 * @param ins 要压缩的源
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 3.0.9 * @since 3.0.9
@@ -278,8 +279,8 @@ public class ZipUtil {
* 路径列表和流列表长度必须一致 * 路径列表和流列表长度必须一致
* *
* @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹 * @param zipFile 生成的Zip文件包括文件名。注意zipPath不能是srcPath路径下的子文件夹
* @param paths 流数据在压缩文件中的路径或文件名 * @param paths 流数据在压缩文件中的路径或文件名
* @param ins 要压缩的源,添加完成后自动关闭流 * @param ins 要压缩的源,添加完成后自动关闭流
* @param charset 编码 * @param charset 编码
* @return 压缩文件 * @return 压缩文件
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -306,6 +307,7 @@ public class ZipUtil {
} }
// ---------------------------------------------------------------------------------------------- Unzip // ---------------------------------------------------------------------------------------------- Unzip
/** /**
* 解压到文件名相同的目录中默认编码UTF-8 * 解压到文件名相同的目录中默认编码UTF-8
* *
@@ -321,7 +323,7 @@ public class ZipUtil {
* 解压到文件名相同的目录中 * 解压到文件名相同的目录中
* *
* @param zipFilePath 压缩文件路径 * @param zipFilePath 压缩文件路径
* @param charset 编码 * @param charset 编码
* @return 解压的目录 * @return 解压的目录
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 3.2.2 * @since 3.2.2
@@ -359,7 +361,7 @@ public class ZipUtil {
* 解压默认UTF-8编码 * 解压默认UTF-8编码
* *
* @param zipFilePath 压缩文件的路径 * @param zipFilePath 压缩文件的路径
* @param outFileDir 解压到的目录 * @param outFileDir 解压到的目录
* @return 解压的目录 * @return 解压的目录
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
@@ -371,8 +373,8 @@ public class ZipUtil {
* 解压 * 解压
* *
* @param zipFilePath 压缩文件的路径 * @param zipFilePath 压缩文件的路径
* @param outFileDir 解压到的目录 * @param outFileDir 解压到的目录
* @param charset 编码 * @param charset 编码
* @return 解压的目录 * @return 解压的目录
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
@@ -433,6 +435,7 @@ public class ZipUtil {
outItemFile = buildFile(outFile, zipEntry.getName()); outItemFile = buildFile(outFile, zipEntry.getName());
if (zipEntry.isDirectory()) { if (zipEntry.isDirectory()) {
// 创建对应目录 // 创建对应目录
//noinspection ResultOfMethodCallIgnored
outItemFile.mkdirs(); outItemFile.mkdirs();
} else { } else {
// 写出文件 // 写出文件
@@ -449,7 +452,7 @@ public class ZipUtil {
* 解压<br> * 解压<br>
* ZIP条目不使用高速缓冲。 * ZIP条目不使用高速缓冲。
* *
* @param in zip文件流使用完毕自动关闭 * @param in zip文件流使用完毕自动关闭
* @param outFile 解压到的目录 * @param outFile 解压到的目录
* @param charset 编码 * @param charset 编码
* @return 解压的目录 * @return 解压的目录
@@ -468,7 +471,7 @@ public class ZipUtil {
* ZIP条目不使用高速缓冲。 * ZIP条目不使用高速缓冲。
* *
* @param zipStream zip文件流包含编码信息 * @param zipStream zip文件流包含编码信息
* @param outFile 解压到的目录 * @param outFile 解压到的目录
* @return 解压的目录 * @return 解压的目录
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 4.5.8 * @since 4.5.8
@@ -500,7 +503,7 @@ public class ZipUtil {
* 从Zip文件中提取指定的文件为bytes * 从Zip文件中提取指定的文件为bytes
* *
* @param zipFilePath Zip文件 * @param zipFilePath Zip文件
* @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt * @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt
* @return 文件内容bytes * @return 文件内容bytes
* @since 4.1.8 * @since 4.1.8
*/ */
@@ -512,8 +515,8 @@ public class ZipUtil {
* 从Zip文件中提取指定的文件为bytes * 从Zip文件中提取指定的文件为bytes
* *
* @param zipFilePath Zip文件 * @param zipFilePath Zip文件
* @param charset 编码 * @param charset 编码
* @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt * @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt
* @return 文件内容bytes * @return 文件内容bytes
* @since 4.1.8 * @since 4.1.8
*/ */
@@ -525,7 +528,7 @@ public class ZipUtil {
* 从Zip文件中提取指定的文件为bytes * 从Zip文件中提取指定的文件为bytes
* *
* @param zipFile Zip文件 * @param zipFile Zip文件
* @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt * @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt
* @return 文件内容bytes * @return 文件内容bytes
* @since 4.1.8 * @since 4.1.8
*/ */
@@ -538,7 +541,7 @@ public class ZipUtil {
* *
* @param zipFile Zip文件 * @param zipFile Zip文件
* @param charset 编码 * @param charset 编码
* @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt * @param name 文件名如果存在于子文件夹中此文件名必须包含目录名例如images/aaa.txt
* @return 文件内容bytes * @return 文件内容bytes
* @since 4.1.8 * @since 4.1.8
*/ */
@@ -564,6 +567,7 @@ public class ZipUtil {
} }
// ----------------------------------------------------------------------------- Gzip // ----------------------------------------------------------------------------- Gzip
/** /**
* Gzip压缩处理 * Gzip压缩处理
* *
@@ -619,7 +623,7 @@ public class ZipUtil {
/** /**
* Gzip压缩文件 * Gzip压缩文件
* *
* @param in 被压缩的流 * @param in 被压缩的流
* @param length 预估长度 * @param length 预估长度
* @return 压缩后的字节流 * @return 压缩后的字节流
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -643,7 +647,7 @@ public class ZipUtil {
/** /**
* Gzip解压缩处理 * Gzip解压缩处理
* *
* @param buf 压缩过的字节流 * @param buf 压缩过的字节流
* @param charset 编码 * @param charset 编码
* @return 解压后的字符串 * @return 解压后的字符串
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -677,7 +681,7 @@ public class ZipUtil {
/** /**
* Gzip解压处理 * Gzip解压处理
* *
* @param in Gzip数据 * @param in Gzip数据
* @param length 估算长度,如果无法确定请传入{@link #DEFAULT_BYTE_ARRAY_LENGTH} * @param length 估算长度,如果无法确定请传入{@link #DEFAULT_BYTE_ARRAY_LENGTH}
* @return 解压后的数据 * @return 解压后的数据
* @throws UtilException IO异常 * @throws UtilException IO异常
@@ -706,7 +710,7 @@ public class ZipUtil {
* *
* @param content 被压缩的字符串 * @param content 被压缩的字符串
* @param charset 编码 * @param charset 编码
* @param level 压缩级别1~9 * @param level 压缩级别1~9
* @return 压缩后的字节流 * @return 压缩后的字节流
* @since 4.1.4 * @since 4.1.4
*/ */
@@ -717,7 +721,7 @@ public class ZipUtil {
/** /**
* Zlib压缩文件 * Zlib压缩文件
* *
* @param file 被压缩的文件 * @param file 被压缩的文件
* @param level 压缩级别 * @param level 压缩级别
* @return 压缩后的字节流 * @return 压缩后的字节流
* @since 4.1.4 * @since 4.1.4
@@ -735,7 +739,7 @@ public class ZipUtil {
/** /**
* 打成Zlib压缩包 * 打成Zlib压缩包
* *
* @param buf 数据 * @param buf 数据
* @param level 压缩级别0~9 * @param level 压缩级别0~9
* @return 压缩后的bytes * @return 压缩后的bytes
* @since 4.1.4 * @since 4.1.4
@@ -747,7 +751,7 @@ public class ZipUtil {
/** /**
* 打成Zlib压缩包 * 打成Zlib压缩包
* *
* @param in 数据流 * @param in 数据流
* @param level 压缩级别0~9 * @param level 压缩级别0~9
* @return 压缩后的bytes * @return 压缩后的bytes
* @since 4.1.19 * @since 4.1.19
@@ -759,8 +763,8 @@ public class ZipUtil {
/** /**
* 打成Zlib压缩包 * 打成Zlib压缩包
* *
* @param in 数据流 * @param in 数据流
* @param level 压缩级别0~9 * @param level 压缩级别0~9
* @param length 预估大小 * @param length 预估大小
* @return 压缩后的bytes * @return 压缩后的bytes
* @since 4.1.19 * @since 4.1.19
@@ -774,7 +778,7 @@ public class ZipUtil {
/** /**
* Zlib解压缩处理 * Zlib解压缩处理
* *
* @param buf 压缩过的字节流 * @param buf 压缩过的字节流
* @param charset 编码 * @param charset 编码
* @return 解压后的字符串 * @return 解压后的字符串
* @since 4.1.4 * @since 4.1.4
@@ -808,7 +812,7 @@ public class ZipUtil {
/** /**
* 解压缩zlib * 解压缩zlib
* *
* @param in 数据流 * @param in 数据流
* @param length 预估长度 * @param length 预估长度
* @return 解压后的bytes * @return 解压后的bytes
* @since 4.1.19 * @since 4.1.19
@@ -823,7 +827,7 @@ public class ZipUtil {
* 获取Zip文件中指定目录下的所有文件只显示文件不显示目录 * 获取Zip文件中指定目录下的所有文件只显示文件不显示目录
* *
* @param zipFile Zip文件 * @param zipFile Zip文件
* @param dir 目录前缀 * @param dir 目录前缀
* @return 文件列表 * @return 文件列表
* @since 4.6.6 * @since 4.6.6
*/ */
@@ -849,6 +853,7 @@ public class ZipUtil {
} }
// ---------------------------------------------------------------------------------------------- Private method start // ---------------------------------------------------------------------------------------------- Private method start
/** /**
* 获得 {@link ZipOutputStream} * 获得 {@link ZipOutputStream}
* *
@@ -863,7 +868,7 @@ public class ZipUtil {
/** /**
* 获得 {@link ZipOutputStream} * 获得 {@link ZipOutputStream}
* *
* @param out 压缩文件流 * @param out 压缩文件流
* @param charset 编码 * @param charset 编码
* @return {@link ZipOutputStream} * @return {@link ZipOutputStream}
*/ */
@@ -876,10 +881,10 @@ public class ZipUtil {
* srcRootDir决定了路径截取的位置例如<br> * srcRootDir决定了路径截取的位置例如<br>
* file的路径为d:/a/b/c/d.txtsrcRootDir为d:/a/b则压缩后的文件与目录为结构为c/d.txt * file的路径为d:/a/b/c/d.txtsrcRootDir为d:/a/b则压缩后的文件与目录为结构为c/d.txt
* *
* @param out 压缩文件存储对象 * @param out 压缩文件存储对象
* @param srcRootDir 被压缩的文件夹根目录 * @param srcRootDir 被压缩的文件夹根目录
* @param file 当前递归压缩的文件或目录对象 * @param file 当前递归压缩的文件或目录对象
* @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩) * @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩)
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
private static void zip(File file, String srcRootDir, ZipOutputStream out, FileFilter filter) throws UtilException { private static void zip(File file, String srcRootDir, ZipOutputStream out, FileFilter filter) throws UtilException {
@@ -908,7 +913,7 @@ public class ZipUtil {
* *
* @param file 需要压缩的文件 * @param file 需要压缩的文件
* @param path 在压缩文件中的路径 * @param path 在压缩文件中的路径
* @param out 压缩文件存储对象 * @param out 压缩文件存储对象
* @throws UtilException IO异常 * @throws UtilException IO异常
* @since 4.0.5 * @since 4.0.5
*/ */
@@ -919,9 +924,9 @@ public class ZipUtil {
/** /**
* 添加文件流到压缩包,添加后关闭流 * 添加文件流到压缩包,添加后关闭流
* *
* @param in 需要压缩的输入流 * @param in 需要压缩的输入流
* @param path 压缩的路径 * @param path 压缩的路径
* @param out 压缩文件存储对象 * @param out 压缩文件存储对象
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
private static void addFile(InputStream in, String path, ZipOutputStream out) throws UtilException { private static void addFile(InputStream in, String path, ZipOutputStream out) throws UtilException {
@@ -943,7 +948,7 @@ public class ZipUtil {
* 在压缩包中新建目录 * 在压缩包中新建目录
* *
* @param path 压缩的路径 * @param path 压缩的路径
* @param out 压缩文件存储对象 * @param out 压缩文件存储对象
* @throws UtilException IO异常 * @throws UtilException IO异常
*/ */
private static void addDir(String path, ZipOutputStream out) throws UtilException { private static void addDir(String path, ZipOutputStream out) throws UtilException {
@@ -960,7 +965,7 @@ public class ZipUtil {
/** /**
* 判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生) * 判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)
* *
* @param zipFile 压缩后的产生的文件路径 * @param zipFile 压缩后的产生的文件路径
* @param srcFiles 被压缩的文件或目录 * @param srcFiles 被压缩的文件或目录
*/ */
private static void validateFiles(File zipFile, File... srcFiles) throws UtilException { private static void validateFiles(File zipFile, File... srcFiles) throws UtilException {
@@ -1005,8 +1010,8 @@ public class ZipUtil {
/** /**
* 从Zip中读取文件流并写出到文件 * 从Zip中读取文件流并写出到文件
* *
* @param zipFile Zip文件 * @param zipFile Zip文件
* @param zipEntry zip文件中的子文件 * @param zipEntry zip文件中的子文件
* @param outItemFile 输出到的文件 * @param outItemFile 输出到的文件
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
*/ */
@@ -1025,8 +1030,8 @@ public class ZipUtil {
/** /**
* 将Zlib流解压到out中 * 将Zlib流解压到out中
* *
* @param in zlib数据流 * @param in zlib数据流
* @param out 输出 * @param out 输出
* @param nowrap true表示兼容Gzip压缩 * @param nowrap true表示兼容Gzip压缩
*/ */
private static void inflater(InputStream in, OutputStream out, boolean nowrap) { private static void inflater(InputStream in, OutputStream out, boolean nowrap) {
@@ -1042,9 +1047,9 @@ public class ZipUtil {
/** /**
* 将普通数据流压缩成zlib到out中 * 将普通数据流压缩成zlib到out中
* *
* @param in zlib数据流 * @param in zlib数据流
* @param out 输出 * @param out 输出
* @param level 压缩级别0~9 * @param level 压缩级别0~9
* @param nowrap true表示兼容Gzip压缩 * @param nowrap true表示兼容Gzip压缩
*/ */
private static void deflater(InputStream in, OutputStream out, int level, boolean nowrap) { private static void deflater(InputStream in, OutputStream out, int level, boolean nowrap) {
@@ -1060,16 +1065,24 @@ public class ZipUtil {
/** /**
* 根据压缩包中的路径构建目录结构在Win下直接构建在Linux下拆分路径单独构建 * 根据压缩包中的路径构建目录结构在Win下直接构建在Linux下拆分路径单独构建
* *
* @param outFile 最外部路径 * @param outFile 最外部路径
* @param fileName 文件名,可以包含路径 * @param fileName 文件名,可以包含路径
* @return 文件或目录 * @return 文件或目录
* @since 5.0.5 * @since 5.0.5
*/ */
private static File buildFile(File outFile, String fileName){ private static File buildFile(File outFile, String fileName) {
if(false == FileUtil.isWindows() && StrUtil.contains(fileName, CharUtil.SLASH)) { if (false == FileUtil.isWindows() && StrUtil.contains(fileName, CharUtil.SLASH)) {
// 在Linux下多层目录创建存在问题/会被当成文件名的一部分,此处做处理 // 在Linux下多层目录创建存在问题/会被当成文件名的一部分,此处做处理
// 使用/拆分路径zip中无\),级联创建父目录
final String[] pathParts = StrUtil.splitToArray(fileName, CharUtil.SLASH); final String[] pathParts = StrUtil.splitToArray(fileName, CharUtil.SLASH);
return FileUtil.file(pathParts); for (int i = 0; i < pathParts.length - 1; i++) {
//由于路径拆分slip不检查在最后一步检查
outFile = new File(outFile, pathParts[i]);
}
//noinspection ResultOfMethodCallIgnored
outFile.mkdirs();
// 最后一个部分作为文件名
fileName = pathParts[pathParts.length -1];
} }
return FileUtil.file(outFile, fileName); return FileUtil.file(outFile, fileName);
} }