/* * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.util; 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.Writer; import java.nio.charset.Charset; /** * Simple utility methods for dealing with streams. The copy methods of this class are * similar to those defined in {@link FileCopyUtils} except that all affected streams are * left open when done. All copy methods use a block size of 4096 bytes. * * <p>Mainly for use within the framework, but also useful for application code. * * @author Juergen Hoeller * @author Phillip Webb * @since 3.2.2 * @see FileCopyUtils */ public abstract class StreamUtils { public static final int BUFFER_SIZE = 4096; private static final byte[] EMPTY_CONTENT = new byte[0]; /** * Copy the contents of the given InputStream into a new byte array. * Leaves the stream open when done. * @param in the stream to copy from * @return the new byte array that has been copied to * @throws IOException in case of I/O errors */ public static byte[] copyToByteArray(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE); copy(in, out); return out.toByteArray(); } /** * Copy the contents of the given InputStream into a String. * Leaves the stream open when done. * @param in the InputStream to copy from * @return the String that has been copied to * @throws IOException in case of I/O errors */ public static String copyToString(InputStream in, Charset charset) throws IOException { Assert.notNull(in, "No InputStream specified"); StringBuilder out = new StringBuilder(); InputStreamReader reader = new InputStreamReader(in, charset); char[] buffer = new char[BUFFER_SIZE]; int bytesRead = -1; while ((bytesRead = reader.read(buffer)) != -1) { out.append(buffer, 0, bytesRead); } return out.toString(); } /** * Copy the contents of the given byte array to the given OutputStream. * Leaves the stream open when done. * @param in the byte array to copy from * @param out the OutputStream to copy to * @throws IOException in case of I/O errors */ 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); } /** * Copy the contents of the given String to the given output OutputStream. * Leaves the stream open when done. * @param in the String to copy from * @param charset the Charset * @param out the OutputStream to copy to * @throws IOException in case of I/O errors */ 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(); } /** * Copy the contents of the given InputStream to the given OutputStream. * Leaves both streams open when done. * @param in the InputStream to copy from * @param out the OutputStream to copy to * @return the number of bytes copied * @throws IOException in case of I/O errors */ 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 = -1; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); byteCount += bytesRead; } out.flush(); return byteCount; } /** * Return an efficient empty {@link InputStream}. * @return a {@link ByteArrayInputStream} based on an empty byte array * @since 4.2.2 */ public static InputStream emptyInput() { return new ByteArrayInputStream(EMPTY_CONTENT); } /** * Return a variant of the given {@link InputStream} where calling * {@link InputStream#close() close()} has no effect. * @param in the InputStream to decorate * @return a version of the InputStream that ignores calls to close */ public static InputStream nonClosing(InputStream in) { Assert.notNull(in, "No InputStream specified"); return new NonClosingInputStream(in); } /** * Return a variant of the given {@link OutputStream} where calling * {@link OutputStream#close() close()} has no effect. * @param out the OutputStream to decorate * @return a version of the OutputStream that ignores calls to close */ public static OutputStream nonClosing(OutputStream out) { Assert.notNull(out, "No OutputStream specified"); return new NonClosingOutputStream(out); } private static class NonClosingInputStream extends FilterInputStream { public NonClosingInputStream(InputStream in) { super(in); } @Override public void close() throws IOException { } } private static class NonClosingOutputStream extends FilterOutputStream { public NonClosingOutputStream(OutputStream out) { super(out); } @Override public void write(byte[] b, int off, int let) throws IOException { // It is critical that we override this method for performance out.write(b, off, let); } @Override public void close() throws IOException { } } }
近期热议
推荐标签 标签
-
服务器
124 引用 • 580 回帖
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
-
游戏
174 引用 • 814 回帖
沉迷游戏伤身,强撸灰飞烟灭。
-
国际化
8 引用 • 26 回帖
i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。
-
星云链
3 引用 • 16 回帖 • 2 关注
星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网
-
新人
51 引用 • 226 回帖
让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
新手上路,请谨慎驾驶! -
SendCloud
2 引用 • 8 回帖 • 458 关注
SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。
-
Lute
25 引用 • 191 回帖 • 22 关注
Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。
-
PHP
175 引用 • 407 回帖 • 497 关注
PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。
-
SOHO
7 引用 • 55 回帖 • 48 关注
为成为自由职业者在家办公而努力吧!
-
倾城之链
23 引用 • 66 回帖 • 126 关注
-
InfluxDB
2 引用 • 59 关注
InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。
- Solo
-
Ubuntu
123 引用 • 168 回帖 • 1 关注
Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。
-
WordPress
58 引用 • 113 回帖 • 274 关注
WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。
-
导航
37 引用 • 168 回帖 • 1 关注
各种网址链接、内容导航。
-
Bootstrap
18 引用 • 33 回帖 • 670 关注
Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。
-
Flutter
39 引用 • 92 回帖 • 9 关注
Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。
-
Wide
30 引用 • 218 回帖 • 615 关注
Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。
欢迎访问我们运维的实例: https://wide.b3log.org
-
阿里巴巴
43 引用 • 221 回帖 • 169 关注
阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。
-
Swagger
26 引用 • 35 回帖 • 2 关注
Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。
-
Git
206 引用 • 358 回帖 • 2 关注
Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
-
阿里云
89 引用 • 345 回帖
阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。
-
微服务
96 引用 • 155 回帖
微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。
-
PostgreSQL
22 引用 • 22 回帖 • 1 关注
PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。
-
GitHub
208 引用 • 2031 回帖
GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。
-
jsDelivr
5 引用 • 31 回帖 • 46 关注
jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。
-
Ruby
7 引用 • 31 回帖 • 202 关注
Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于