diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/compress/ZipReader.java b/hutool-core/src/main/java/org/dromara/hutool/core/compress/ZipReader.java index 4a6509b12..d5b139167 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/compress/ZipReader.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/compress/ZipReader.java @@ -184,7 +184,7 @@ public class ZipReader implements Closeable { outItemFile.mkdirs(); } else { // 文件 - FileUtil.writeFromStream(this.resource.get(zipEntry), outItemFile, false); + FileUtil.copy(this.resource.get(zipEntry), outItemFile); } } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java index ad6b417e9..02c569d1a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java @@ -938,18 +938,51 @@ public class FileUtil extends PathUtil { .toFile(); } + /** + * 通过JDK7+的 Files#copy(InputStream, Path, CopyOption...) 方法拷贝文件 + * + * @param src 源文件流,使用后不关闭 + * @param target 目标文件 + * @param options {@link StandardCopyOption} + * @return 目标文件 + * @throws IORuntimeException IO异常 + * @since 5.8.27 + */ + public static File copy(final InputStream src, final File target, final StandardCopyOption... options) throws IORuntimeException { + // check + Assert.notNull(src, "Source File is null !"); + Assert.notNull(target, "Target File or directory is null !"); + return copy(src, target.toPath(), options).toFile(); + } + + /** + * 将文件写入流中,此方法不会关闭输出流 + * + * @param src 文件 + * @param out 流 + * @return 写出的流byte数 + * @throws IORuntimeException IO异常 + * @since 6.0.0 + */ + public static long copy(final File src, final OutputStream out) throws IORuntimeException { + // check + Assert.notNull(src, "Source File is null !"); + Assert.notNull(out, "Target stream is null !"); + return copy(src.toPath(), out); + } + /** * 复制文件或目录
* 如果目标文件为目录,则将源文件以相同文件名拷贝到目标目录 * * @param srcPath 源文件或目录 - * @param destPath 目标文件或目录,目标不存在会自动创建(目录、文件都创建) + * @param targetPath 目标文件或目录,目标不存在会自动创建(目录、文件都创建) * @param isOverride 是否覆盖目标文件 * @return 目标目录或文件 * @throws IORuntimeException IO异常 */ - public static File copy(final String srcPath, final String destPath, final boolean isOverride) throws IORuntimeException { - return copy(file(srcPath), file(destPath), isOverride); + public static File copy(final String srcPath, final String targetPath, final boolean isOverride) throws IORuntimeException { + return copy(file(srcPath), file(targetPath), isOverride); } /** @@ -2464,70 +2497,6 @@ public class FileUtil extends PathUtil { public static File writeBytes(final byte[] data, final File dest, final int off, final int len, final boolean isAppend) throws IORuntimeException { return FileWriter.of(dest).write(data, off, len, isAppend); } - - /** - * 将流的内容写入文件
- * 此方法会自动关闭输入流 - * - * @param target 目标文件 - * @param in 输入流 - * @return dest - * @throws IORuntimeException IO异常 - */ - public static File writeFromStream(final InputStream in, final File target) throws IORuntimeException { - return writeFromStream(in, target, true); - } - - /** - * 将流的内容写入文件 - * - * @param target 目标文件 - * @param in 输入流 - * @param isCloseIn 是否关闭输入流 - * @return dest - * @throws IORuntimeException IO异常 - * @since 5.5.6 - */ - public static File writeFromStream(final InputStream in, final File target, final boolean isCloseIn) throws IORuntimeException { - return FileWriter.of(target).writeFromStream(in, isCloseIn); - } - - /** - * 将流的内容写入文件
- * 此方法会自动关闭输入流 - * - * @param in 输入流 - * @param fullFilePath 文件绝对路径 - * @return 目标文件 - * @throws IORuntimeException IO异常 - */ - public static File writeFromStream(final InputStream in, final String fullFilePath) throws IORuntimeException { - return writeFromStream(in, touch(fullFilePath)); - } - - /** - * 将文件写入流中,此方法不会关闭输出流 - * - * @param file 文件 - * @param out 流 - * @return 写出的流byte数 - * @throws IORuntimeException IO异常 - */ - public static long writeToStream(final File file, final OutputStream out) throws IORuntimeException { - return FileReader.of(file).writeToStream(out); - } - - /** - * 将路径对应文件写入流中,此方法不会关闭输出流 - * - * @param fullFilePath 文件绝对路径 - * @param out 输出流 - * @return 写出的流byte数 - * @throws IORuntimeException IO异常 - */ - public static long writeToStream(final String fullFilePath, final OutputStream out) throws IORuntimeException { - return writeToStream(touch(fullFilePath), out); - } // endregion /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/PathUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/PathUtil.java index f320fbe17..aad6fa51b 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/PathUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/PathUtil.java @@ -279,16 +279,16 @@ public class PathUtil { * 通过JDK7+的 {@link Files#copy(InputStream, Path, CopyOption...)} 方法拷贝文件 * * @param src 源文件流,使用后不闭流 - * @param target 目标文件或目录,如果为目录使用与源文件相同的文件名 + * @param out 目标流 * @return 拷贝bytes数 * @throws IORuntimeException IO异常 * @since 6.0.0 */ - public static long copy(final Path src, final OutputStream target) throws IORuntimeException { + public static long copy(final Path src, final OutputStream out) throws IORuntimeException { Assert.notNull(src, "Source is null !"); try { - return Files.copy(src, target); + return Files.copy(src, out); } catch (final IOException e) { throw new IORuntimeException(e); } diff --git a/hutool-db/src/test/java/org/dromara/hutool/db/PicTransferTest.java b/hutool-db/src/test/java/org/dromara/hutool/db/PicTransferTest.java index 3b24a6420..932af256a 100644 --- a/hutool-db/src/test/java/org/dromara/hutool/db/PicTransferTest.java +++ b/hutool-db/src/test/java/org/dromara/hutool/db/PicTransferTest.java @@ -41,6 +41,6 @@ public class PicTransferTest { private static void save(final ResultSet rs) throws SQLException{ final String destDir = "d:/test/pic"; final String path = StrUtil.format("{}/{}-{}.jpg", destDir, rs.getString("NAME"), rs.getString("GROUP")); - FileUtil.writeFromStream(rs.getBlob("PIC").getBinaryStream(), path); + FileUtil.copy(rs.getBlob("PIC").getBinaryStream(), FileUtil.file(path)); } } diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index a3d262620..4d48008f9 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -74,6 +74,10 @@ slf4j-api org.slf4j + + commons-lang3 + org.apache.commons + true @@ -106,6 +110,10 @@ slf4j-api org.slf4j + + commons-io + commons-io + true @@ -496,7 +504,7 @@ org.apache.commons commons-compress - 1.26.0 + 1.26.1 compile true diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/SevenZExtractor.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/SevenZExtractor.java index e62e51dd1..85340df3e 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/SevenZExtractor.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/SevenZExtractor.java @@ -55,7 +55,8 @@ public class SevenZExtractor implements Extractor, RandomAccess { */ public SevenZExtractor(final File file, final char[] password) { try { - this.sevenZFile = new SevenZFile(file, password); + this.sevenZFile = SevenZFile.builder() + .setFile(file).setPassword(password).get(); } catch (final IOException e) { throw new IORuntimeException(e); } @@ -97,7 +98,8 @@ public class SevenZExtractor implements Extractor, RandomAccess { */ public SevenZExtractor(final SeekableByteChannel channel, final char[] password) { try { - this.sevenZFile = new SevenZFile(channel, password); + this.sevenZFile = SevenZFile.builder() + .setSeekableByteChannel(channel).setPassword(password).get(); } catch (final IOException e) { throw new IORuntimeException(e); } @@ -160,7 +162,7 @@ public class SevenZExtractor implements Extractor, RandomAccess { } else if (entry.hasStream()) { // 读取entry对应数据流 // 此处直接读取而非调用sevenZFile.getInputStream(entry),因为此方法需要遍历查找entry对应位置,性能不好。 - FileUtil.writeFromStream(new Seven7EntryInputStream(sevenZFile, entry), outItemFile); + FileUtil.copy(new Seven7EntryInputStream(sevenZFile, entry), outItemFile); } else { // 无数据流的文件创建为空文件 FileUtil.touch(outItemFile); diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/StreamExtractor.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/StreamExtractor.java index 86b435fad..26943f55f 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/StreamExtractor.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/extractor/StreamExtractor.java @@ -39,7 +39,7 @@ import java.util.function.Predicate; */ public class StreamExtractor implements Extractor { - private final ArchiveInputStream in; + private final ArchiveInputStream in; /** * 构造 @@ -81,7 +81,7 @@ public class StreamExtractor implements Extractor { */ public StreamExtractor(final Charset charset, final String archiverName, InputStream in) { if (in instanceof ArchiveInputStream) { - this.in = (ArchiveInputStream) in; + this.in = (ArchiveInputStream) in; return; } @@ -109,7 +109,7 @@ public class StreamExtractor implements Extractor { @Override public InputStream getFirst(final Predicate predicate) { - final ArchiveInputStream in = this.in; + final ArchiveInputStream in = this.in; ArchiveEntry entry; try { while (null != (entry = in.getNextEntry())) { @@ -156,7 +156,7 @@ public class StreamExtractor implements Extractor { */ private void extractInternal(final File targetDir, final Predicate predicate) throws IOException { Assert.isTrue(null != targetDir && ((!targetDir.exists()) || targetDir.isDirectory()), "target must be dir."); - final ArchiveInputStream in = this.in; + final ArchiveInputStream in = this.in; ArchiveEntry entry; File outItemFile; while (null != (entry = in.getNextEntry())) { @@ -173,7 +173,7 @@ public class StreamExtractor implements Extractor { //noinspection ResultOfMethodCallIgnored outItemFile.mkdirs(); } else { - FileUtil.writeFromStream(in, outItemFile, false); + FileUtil.copy(in, outItemFile); } } }