diff --git a/CHANGELOG.md b/CHANGELOG.md index fbb06704a..d23b3fbc7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,14 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.27(2024-03-07) +# 5.8.27(2024-03-11) ### 🐣新特性 * 【extra 】 FreemarkerEngine修改默认版本参数 * 【db 】 增加达梦数据库方言(pr#1178@Gitee) * 【core 】 HexUtil#format方法增加prefix参数(issue#I93PU9@Gitee) * 【core 】 StrUtil.replace歧义,修改为replaceByCodePoint(issue#I96LWH@Gitee) +* 【core 】 FileUtil和PathUtil增加Resource重载(issue#I97FJT@Gitee) ### 🐞Bug修复 * 【core 】 修复PathMover对目标已存在且只读文件报错错误问题(issue#I95CLT@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 6b94a4f52..7e25615a6 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -10,6 +10,7 @@ import cn.hutool.core.io.file.FileWriter; import cn.hutool.core.io.file.LineSeparator; import cn.hutool.core.io.file.PathUtil; import cn.hutool.core.io.file.Tailer; +import cn.hutool.core.io.resource.Resource; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.io.unit.DataSizeUtil; import cn.hutool.core.lang.Assert; @@ -1037,6 +1038,40 @@ public class FileUtil extends PathUtil { return copyFile(Paths.get(src), Paths.get(dest), options).toFile(); } + /** + * 通过JDK7+的 Files#copy(InputStream, Path, CopyOption...) 方法拷贝文件 + * + * @param src 源文件 + * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名 + * @param options {@link StandardCopyOption} + * @return 目标文件 + * @throws IORuntimeException IO异常 + * @since 5.8.27 + */ + public static File copyFile(Resource src, File dest, StandardCopyOption... options) throws IORuntimeException { + // check + Assert.notNull(src, "Source File is null !"); + Assert.notNull(dest, "Destination File or directiory is null !"); + return copyFile(src, dest.toPath(), options).toFile(); + } + + /** + * 通过JDK7+的 Files#copy(InputStream, Path, CopyOption...) 方法拷贝文件 + * + * @param src 源文件 + * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名 + * @param options {@link StandardCopyOption} + * @return 目标文件 + * @throws IORuntimeException IO异常 + * @since 5.8.27 + */ + public static File copyFile(InputStream src, File dest, StandardCopyOption... options) throws IORuntimeException { + // check + Assert.notNull(src, "Source File is null !"); + Assert.notNull(dest, "Destination File or directiory is null !"); + return copyFile(src, dest.toPath(), options).toFile(); + } + /** * 通过JDK7+的 Files#copy(Path, Path, CopyOption...) 方法拷贝文件 * diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java index cf3b6568e..fc2a38e7f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java @@ -1,33 +1,17 @@ package cn.hutool.core.io.file; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.file.visitor.CopyVisitor; import cn.hutool.core.io.file.visitor.DelVisitor; +import cn.hutool.core.io.resource.FileResource; +import cn.hutool.core.io.resource.Resource; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.CharsetUtil; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.nio.charset.Charset; -import java.nio.file.AccessDeniedException; -import java.nio.file.CopyOption; -import java.nio.file.DirectoryStream; -import java.nio.file.FileVisitOption; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.StandardCopyOption; +import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.EnumSet; @@ -197,6 +181,47 @@ public class PathUtil { return true; } + /** + * 通过JDK7+的 {@link Files#copy(InputStream, Path, CopyOption...)} 方法拷贝文件 + * + * @param src 源文件流 + * @param target 目标文件或目录,如果为目录使用与源文件相同的文件名 + * @param options {@link StandardCopyOption} + * @return 目标Path + * @throws IORuntimeException IO异常 + * @since 5.8.27 + */ + public static Path copyFile(Resource src, Path target, CopyOption... options) throws IORuntimeException { + Assert.notNull(src, "Source is null !"); + if(src instanceof FileResource){ + return copyFile(((FileResource) src).getFile().toPath(), target, options); + } + return copyFile(src.getStream(), target, options); + } + + /** + * 通过JDK7+的 {@link Files#copy(InputStream, Path, CopyOption...)} 方法拷贝文件 + * + * @param src 源文件流 + * @param target 目标文件或目录,如果为目录使用与源文件相同的文件名 + * @param options {@link StandardCopyOption} + * @return 目标Path + * @throws IORuntimeException IO异常 + * @since 5.8.27 + */ + public static Path copyFile(InputStream src, Path target, CopyOption... options) throws IORuntimeException { + Assert.notNull(src, "Source is null !"); + Assert.notNull(target, "Destination File or directory is null !"); + + try { + Files.copy(src, target, options); + } catch (IOException e) { + throw new IORuntimeException(e); + } + + return target; + } + /** * 通过JDK7+的 {@link Files#copy(Path, Path, CopyOption...)} 方法拷贝文件
* 此方法不支持递归拷贝目录,如果src传入是目录,只会在目标目录中创建空目录 @@ -204,7 +229,7 @@ public class PathUtil { * @param src 源文件路径,如果为目录只在目标中创建新目录 * @param dest 目标文件或目录,如果为目录使用与源文件相同的文件名 * @param options {@link StandardCopyOption} - * @return Path + * @return 目标Path * @throws IORuntimeException IO异常 */ public static Path copyFile(Path src, Path dest, StandardCopyOption... options) throws IORuntimeException { @@ -218,7 +243,7 @@ public class PathUtil { * @param src 源文件路径,如果为目录只在目标中创建新目录 * @param target 目标文件或目录,如果为目录使用与源文件相同的文件名 * @param options {@link StandardCopyOption} - * @return Path + * @return 目标Path * @throws IORuntimeException IO异常 * @since 5.4.1 */