Spring工具类:FileCopyUtils、StreamUtils

文章目录

  • FileCopyUtils
  • StreamUtils
  • 参考资料

Spring 在 org.springframework.util 包提供了很多实用的工具类。今天关心一下Copy 相关的两个:

FileCopyUtils

FileCopyUtils就是对StreamUtilscopy方法进行了封装,在每次复制完毕后关闭流。(因为StreamUtils在复制完成后流都是保持打开的。)

修饰符返回值方法介绍
staticvoidcopy(byte[] in, File out)将给定字节数组的内容复制到给定输出文件
staticvoidcopy(byte[] in, OutputStream out)将给定字节数组的内容复制到给定的OutputStream
staticintcopy(File in, File out)将给定输入File的内容复制到给定输出File
staticintcopy(InputStream in, OutputStream out)将给定的InputStream的内容复制到给定的OutputStream
staticintcopy(Reader in, Writer out)将给定Reade的内容复制到给定Writer
staticvoidcopy(String in, Writer out)将给定String的内容复制到给定Writer
staticbyte[]copyToByteArray(File in)将给定输入File的内容复制到一个新的字节数组中。
staticbyte[]copyToByteArray(InputStream in)将给定的InputStream的内容复制到一个新的字节数组中。
staticStringcopyToString(Reader in)将给定Reader的内容复制到String中。

StreamUtils

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FilterInputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.nio.charset.Charset;import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.FileCopyUtils;/*** 处理流的简单实用方法。 此类中与 {@link FileCopyUtils} 的 copy 方法区别在于,不会关闭流。 * 所有 copy 方法的缓冲区大小都是 4096 字节。** <p>主要用于Spring框架, 但对于应用级别代码也很有用。* @see FileCopyUtils*/
public abstract class StreamUtils {/*** 用于 copy 的默认缓冲区大小.*/public static final int BUFFER_SIZE = 4096;private static final byte[] EMPTY_CONTENT = new byte[0];/*** 将给定的 {@link InputStream} 内容复制到新的 {@code byte[]} 中,完成后保持流的打开状态。* @param in 作为数据来源的输入流(可能为 {@code null} 或 空)* @return 一个接收了数据的新字节数组 byte[] (可能为 空)* @throws IOException 可能抛IO异常*/public static byte[] copyToByteArray(@Nullable InputStream in) throws IOException {if (in == null) {return new byte[0];}ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE);copy(in, out);return out.toByteArray();}/*** 将给定的 {@link InputStream} 内容复制到 {@link String} 中,完成后保持流的打开状态。* @param in 作为数据来源的输入流(可能为 {@code null} 或 空)* @param charset {@link Charset}解码所需字符集* @return 一个接收了数据的字符串 String (可能为 空)* @throws IOException 可能抛IO异常*/public static String copyToString(@Nullable InputStream in, Charset charset) throws IOException {if (in == null) {return "";}StringBuilder out = new StringBuilder(BUFFER_SIZE);InputStreamReader reader = new InputStreamReader(in, charset);char[] buffer = new char[BUFFER_SIZE];int charsRead;while ((charsRead = reader.read(buffer)) != -1) {out.append(buffer, 0, charsRead);}return out.toString();}/*** 将给定的 {@link ByteArrayOutputStream} 内容复制到 {@link String} 中,完成后保持流的打开状态。* <p>比 {@code new String(baos.toByteArray(), charset)} 更有效。* @param baos 复制到字符串的数据来源 {@code ByteArrayOutputStream}* @param charset 用于解码的字符集 {@link Charset}* @return 复制得到的字符串 (可能为 空)* @since 5.2.6*/public static String copyToString(ByteArrayOutputStream baos, Charset charset) {Assert.notNull(baos, "No ByteArrayOutputStream specified");Assert.notNull(charset, "No Charset specified");try {// 在 Java 10+ 也可以换成 toString(Charset)return baos.toString(charset.name());}catch (UnsupportedEncodingException ex) {// 人祸:字符集名字有误throw new IllegalArgumentException("Invalid charset name: " + charset, ex);}}/*** 将给定的 {@code byte[]} 字节数组内容复制到给定的 {@link OutputStream} 中,完成后保持流的打开状态。* @param in 作为来源的字节数组* @param out 复制到目标输出流* @throws IOException 可能抛IO异常*/public static void copy(byte[] in, OutputStream out) throws IOException {Assert.notNull(in, "No input byte array specified");Assert.notNull(out, "No OutputStream specified");out.write(in);out.flush();}/*** 将给定的字符串 {@link String} 内容复制到给定的 {@link OutputStream} 中,完成后保持流的打开状态。* @param in 数据来源:字符串* @param charset 来源字符串对应的字符集* @param out 复制到目标输出流* @throws IOException 可能抛IO异常*/public static void copy(String in, Charset charset, OutputStream out) throws IOException {Assert.notNull(in, "No input String specified");Assert.notNull(charset, "No Charset specified");Assert.notNull(out, "No OutputStream specified");Writer writer = new OutputStreamWriter(out, charset);writer.write(in);writer.flush();}/*** 将给定的 {@link InputStream} 内容复制到给定的 {@link OutputStream} 中,完成后保持流的打开状态。* @param in 数据来源输入流* @param out 复制到目标输出流* @return 复制了多少字节* @throws IOException 可能抛IO异常*/public static int copy(InputStream in, OutputStream out) throws IOException {Assert.notNull(in, "No InputStream specified");Assert.notNull(out, "No OutputStream specified");int byteCount = 0;byte[] buffer = new byte[BUFFER_SIZE];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);byteCount += bytesRead;}out.flush();return byteCount;}/*** 将给定的 {@link InputStream} 内容复制到给定的 {@link OutputStream} 中,* <p>如果指定的复制范围朝出了 {@code InputStream} 的大小,则返回实际复制了多少字节。* <p>两个流完成后都保持打开状态。* @param in 数据来源输入流* @param out 复制到目标输出流* @param start 开始复制的位置* @param end 结束复制的位置* @return 复制了多少字节* @throws IOException 可能抛IO异常* @since 4.3*/public static long copyRange(InputStream in, OutputStream out, long start, long end) throws IOException {Assert.notNull(in, "No InputStream specified");Assert.notNull(out, "No OutputStream specified");long skipped = in.skip(start);if (skipped < start) {throw new IOException("Skipped only " + skipped + " bytes out of " + start + " required");}long bytesToCopy = end - start + 1;byte[] buffer = new byte[(int) Math.min(org.springframework.util.StreamUtils.BUFFER_SIZE, bytesToCopy)];while (bytesToCopy > 0) {int bytesRead = in.read(buffer);if (bytesRead == -1) {break;}else if (bytesRead <= bytesToCopy) {out.write(buffer, 0, bytesRead);bytesToCopy -= bytesRead;}else {out.write(buffer, 0, (int) bytesToCopy);bytesToCopy = 0;}}return (end - start + 1 - bytesToCopy);}/*** 清除给定流中的剩余内容,完成后保持流的打开状态。* @param in 需要清空的输入流* @return 读取到多少字节* @throws IOException 可能抛IO异常* @since 4.3*/public static int drain(InputStream in) throws IOException {Assert.notNull(in, "No InputStream specified");byte[] buffer = new byte[BUFFER_SIZE];int bytesRead = -1;int byteCount = 0;while ((bytesRead = in.read(buffer)) != -1) {byteCount += bytesRead;}return byteCount;}/*** 返回一个有效的输入流 {@link InputStream}* @return  一个用空字节数组创建的 {@link ByteArrayInputStream}* @since 4.2.2*/public static InputStream emptyInput() {return new ByteArrayInputStream(EMPTY_CONTENT);}/*** 将给定的 {@link InputStream} 装饰成一个 {@link InputStream#close() .close()} 无效的变种* @param in 需要被装饰的输入流* @return 一个调用 {@link InputStream#close() close()} 没效果的 InputStream 版本*/public static InputStream nonClosing(InputStream in) {Assert.notNull(in, "No InputStream specified");return new org.springframework.util.StreamUtils.NonClosingInputStream(in);}/*** 将给定的 {@link OutputStream} 装饰成一个 {@link OutputStream#close() .close()} 无效的变种* @param out 需要被装饰的输出流* @return 一个调用 {@link OutputStream#close() close()} 没效果的 OutputStream 版本*/public static OutputStream nonClosing(OutputStream out) {Assert.notNull(out, "No OutputStream specified");return new org.springframework.util.StreamUtils.NonClosingOutputStream(out);}/*** 静态内部类,重写了 close()*/private static class NonClosingInputStream extends FilterInputStream {public NonClosingInputStream(InputStream in) {super(in);}@Overridepublic void close() throws IOException {}}/*** 静态内部类,重写了 close()*/private static class NonClosingOutputStream extends FilterOutputStream {public NonClosingOutputStream(OutputStream out) {super(out);}@Overridepublic void write(byte[] b, int off, int let) throws IOException {// 为了提高性能,重写这个方法是至关重要的 this.out.write(b, off, let);}@Overridepublic void close() throws IOException {}}}

参考资料

org.springframework.util.FileCopyUtils
org.springframework.util.StreamUtils

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring自带工具类(断言、ObjectUtils、FileCopyUtils、ResourceUtils、StreamUtils、ReflectionUtils、AopUtils、AopCont)

文章目录断言对象、数组、集合文件、资源、IO 流反射、AOP断言 断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-enableassertions开启SpringBoot 中提供了 Assert 断言工具类&#xff0c;通常用于数据合法…

Arrays.asList踩坑——引发的Exception in thread “main“ java.lang.UnsupportedOperationException

Exception in thread “main” java.lang.UnsupportedOperationException 如果你尝试修改Arrays.asList方法生产的List&#xff0c;那么就会报这个错误 public static void main(String[] args) {Integer[] arr new Integer[]{7,8,9};List<Integer> list Arrays.asLi…

GIS算法:JAVA拓扑套件JTS

常用可以用于GIS数据处理和空间计算的java包有geotool和jts。 相对来说&#xff0c;geotool功能更全面&#xff0c;还可以用于数据转换、瓦片地图发布、栅格影像分析等&#xff0c;jts只能进行基本的数据处理和空间计算。 但大多数情况下jts就完全够用了。 geotool的官网&am…

Java本地远程服务器debug调试详解

日常我们debug是经常用的&#xff0c;但是本地还好说&#xff0c;远程debug就有点难度&#xff0c;而且有时候必须要在预演&#xff0c;测试环境的服务器去debug&#xff0c;举个例子&#xff0c;需要https&#xff0c;公网&#xff0c;域名之类的&#xff0c;测试服务器这些有…

Linux “ll“ 命令详解

“ls -l” “ls -al” ll 用来查询当前目录下文件及目录的详情 1.第一位文件类型 普通文件 &#xff0c; d 目录文件&#xff0c;I 链接文件&#xff0c;p 管理文件&#xff0c; b 块设备文件&#xff0c; c 字符设备文件&#xff0c; s 套接字文件 2.文件属性 第一部分表示文…

使用BASE64Decoder完成文件与二进制之间互相转化

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;/**\* 使用sun.misc.BASE64Decoder和sun.misc.BASE64Encoder\* 完成文件转化二进…

SpringBoot项目jar发布获取jar包所在目录路径

//第一种File path new File(ResourceUtils.getURL("classpath:").getPath());if(!path.exists()) path new File("");System.out.println(path.getAbsolutePath());//第二种System.out.println(System.getProperty("user.dir"));//第三种Stri…

路径classpath,classpath*,以及file:

./ 当前目录 …/上一层目录 /是根目录 1. classpath : 类路径&#xff0c;指的是编译后的字节码文件存储路径&#xff0c;一般为target目录下的classes目录&#xff08;java项目&#xff09;&#xff0c;在web项目中指的是WEB-INF下的classes目录。实际上&#xff0c;两者其实…

到底什么时候该使用MQ?

一、缘起 一切脱离业务的架构设计与新技术引入都是耍流氓。 引入一个技术之前&#xff0c;首先应该解答的问题是&#xff0c;这个技术解决什么问题。 就像微服务分层架构之前&#xff0c;应该首先回答&#xff0c;为什么要引入微服务&#xff0c;微服务究竟解决什么问题&…

Java中ByteArrayInputStream和ByteArrayOutputStream用法详解

Java中ByteArrayInputStream和ByteArrayOutputStream用法详解 这篇文章主要介绍了Java中ByteArrayInputStream和ByteArrayOutputStream用法详解&#xff0c; ByteArrayInputStream 的内部额外的定义了一个计数器&#xff0c;它被用来跟踪 read() 方法要读取的下一个字节 Byte…

Java中的Base64详解

详解Java中的Base64原理跟用法 简介 ​ Base64编码&#xff0c;是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法, 也是MIME&#xff08;多用途互联网邮件扩展&#xff0c;主要用…

Java程序执行Linux命令

java程序中要执行linux命令主要依赖2个类&#xff1a;Process和Runtime 首先看一下Process类&#xff1a; ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程&#xff0c;并返回 Process 子类的一个实例&#xff0c; 该实例可用来控制进程并获得相关信息。Proces…

ImageIO类说明

最近的项目中遇到ImageIO&#xff0c;因此记录下这个类的用法 一、ImageIO&#xff1a; 这个类中的方法都是静态方法&#xff0c;可以用来进行简单的图片IO操作 1、读入的三种方法 public static BufferedImage read(File input) File file new File("/Users/xixi/Docum…

java:图像(BufferedImage)色彩空间转换(灰度)暨获取图像矩阵数据byte[](sRGB/gray)

ColorConvertOp java.awt.image包下面有个类java.awt.image.ColorConvertOp,类名直译就是”颜色转换操作”。 顾名思义,它的作用就是将一个色彩空间(color space)的图像转换为另一个色彩空间的图像。有了这个神器我们就能轻易的将一张彩色图你像转换成灰度(gray)或其他色彩空间…

MyBatis-Plus updateById方法更新不了空字符串/null解决方法

最近遇到了Mybatis-Plus updateById()&#xff0c;更新某一个字段为null&#xff0c;却发现没有更新成功。记录一下 一、简介 因为最近在忙项目&#xff0c;好久都没有更新博客&#xff0c;最近在项目中刚好遇到一个问题&#xff0c;就是在使用MyBatis-Plus updateById&#…

Java 分割字符串的方法String.split()底层原理与使用

文章目录split()底层原理1.举例说明2.split源码分析3.API原解4.regex参数API原解5.limit参数介绍6.结果的验证7.此方法的使用split方法的使用split用法分析参数解释—regex参数解释—limit不同limit值的情况下的split结果验证扩展split()底层原理 1.举例说明 1.最普通的用法 …

MySQL中数据类型的长度问题解析

MySQL中数据类型的长度问题总结 1&#xff09;&#xff1a;int类型&#xff0c;对吧&#xff0c;经常像保存个时间戳啊、id啊、数量啊、排序啊都会用到 提问&#xff1a;INT&#xff08;11&#xff09;是什么意思&#xff1f;最大保存十一位数么&#xff1f; 回答&#xff1a;…

HttpComponents入门解析

1 简介 超文本传输协议(http)是目前互联网上极其普遍的传输协议&#xff0c;它为构建功能丰富&#xff0c;绚丽多彩的网页提供了强大的支持。构建一个网站&#xff0c;通常无需直接操作http协议&#xff0c;目前流行的WEB框架已经透明的将这些底层功能封装的很好了&#xff0c…

HttpClient使用和详解

文章目录一、关于HttpClient二、HttpClient使用步骤详解1、创建一个HttpClient对象A、HttpCLientConnectionManagerB、HttpRoutePlannerC、RequestConfig2、创建一个Request对象3、执行Request请求4、处理response1&#xff09;关闭和entity相关的content stream2&#xff09;关…

你还在 Docker 中跑 MySQL?

容器的定义&#xff1a;容器是为了解决“在切换运行环境时&#xff0c;如何保证软件能够正常运行”这一问题。 目前&#xff0c;容器和 Docker依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以&…