Java读取InputStream文本的几种方法总结,附读取字节流bytes字节数组byte[]方法
最新推荐文章于 2024-08-24 02:53:13 发布
最新推荐文章于 2024-08-24 02:53:13 发布
阅读量1.3w
收藏
7
点赞数
3
分类专栏:
成长的程序员
文章标签:
java
成长的程序员
专栏收录该内容
80 篇文章
订阅专栏
该博客探讨了从InputStream转换为文本的几种方法,包括使用阿里巴巴的Fastjson库、DataInputStream的readUTF方法以及BufferedReader。文章指出,ByteArrayOutputStream是最科学的选择,并提供了详细的代码示例。同时,注意到不同方法存在的潜在问题,如换行符处理和异常处理。
package org.jeecg.common.util;
import com.alibaba.fastjson.util.IOUtils;
import lombok.var;
import java.io.*;
public class StreamUtil {
/**
* @deprecated IOUtils.readAll
*/
static String readText_ali(InputStream inputStream) {
try {
InputStreamReader dataReader = new InputStreamReader(inputStream);
String result = IOUtils.readAll(dataReader);
dataReader.close();
inputStream.close();
return result;
} catch (Exception ex) {
LogUtil.debug("Stream2Text error! readText_ali");
return ex.toString();
}
}
/**
* @deprecated java.io.EOFException
*/
static String readText_readUtf(InputStream inputStream) {
try {
var dataInputStream = new DataInputStream(inputStream);
var result = dataInputStream.readUTF();
dataInputStream.close();
inputStream.close();
return result;
} catch (Exception ex) {
LogUtil.debug("Stream2Text error! readText_readUtf");
return ex.toString();
}
}
/**
* @deprecated 这个是有缺陷的,如果换行符是\n不是\r\n那么文本就变了
*/
static String readText_bufferedReader(InputStream inputStream) {
try {
var inputStreamReader = new InputStreamReader(inputStream);
var bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
StringBuilder stringBuilder = new StringBuilder();
while ((line = bufferedReader.readLine()) != null)
stringBuilder.append(line + "\r\n");
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
return stringBuilder.toString();
} catch (Exception ex) {
LogUtil.debug("Stream2Text error! getText_bufferedReader");
return ex.toString();
}
}
static String readText_bytesOut(InputStream inputStream, String charset) {
try {
var byteArrayOutputStream = new ByteArrayOutputStream();
int _byte;
while ((_byte = inputStream.read()) != -1)
byteArrayOutputStream.write(_byte);
var result = byteArrayOutputStream.toString(charset);
byteArrayOutputStream.close();
inputStream.close();
return result;
} catch (Exception ex) {
LogUtil.debug("Stream2Text error! readText_bytesOut");
return ex.toString();
}
}
public static String readText(InputStream inputStream, String charset) {
return readText_bytesOut(inputStream, charset);
}
public static byte[] readBytes(InputStream inputStream) {
try {
var byteArrayOutputStream = new ByteArrayOutputStream();
int _byte;
while ((_byte = inputStream.read()) != -1)
byteArrayOutputStream.write(_byte);
var result = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
inputStream.close();
return result;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
总结:ByteArrayOutputStream最科学
关注博主即可阅读全文
确定要放弃本次机会?
福利倒计时
:
:
立减 ¥
普通VIP年卡可用
立即使用
关注
关注
3
点赞
踩
7
收藏
觉得还不错?
一键收藏
知道了
2
评论
分享
复制链接
分享到 QQ
分享到新浪微博
扫一扫
打赏
打赏
打赏
举报
举报
专栏目录
Java InputStream实战指南:轻松读取、操作文件流
喵手的博客
05-03
4115
Java是一门非常流行的编程语言,广泛应用于各种应用程序的开发。在Java中,输入输出是非常重要的基础功能。其中,InputStream是Java中的一个重要输入流类,用于从输入源读取数据。本文将介绍InputStream类的源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。InputStream是Java中的一个抽象类,用于从输入源读取数据。int read():从输入流中读取一个字节的数据。如果已经到达输入流的末尾,则返回-1。
2 条评论
您还未登录,请先
登录
后发表或查看评论
【Java高级特性】I/O流——使用字符流读写文件
baaa111的博客
10-11
3343
使用字符流BufferedReader类和BufferedWriter类读写文件
使用DataInputStream类和DataOutputStream类读写二进制文件。
java InputStream读取数据问题
04-02
NULL
博文链接:https://cuisuqiang.iteye.com/blog/1434416
java 读取 inputstream_java InputStream读取数据问题
weixin_28389377的博客
02-12
624
1. 关于InputStream.read()在从数据流里读取数据时,为图简单,经常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会非常低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。2. 关于InputStrea...
HttpClient Post 二进制/字节流/byte[]实例代码
10-19
在本文中,我们将深入探讨如何使用HttpClient进行POST请求,特别是发送二进制/字节流/byte[]数据。 ### HttpClient 3.x 实例 在HttpClient 3.x版本中,我们使用`HttpClient`类来创建一个HTTP客户端实例,然后通过`...
Java字节流读取中文文本编码解码详解
qq_51214556的博客
09-17
3575
1.字节流
1.1.读取字节
1.2.转化字符
1.2.1.构建字节数组解码
1.2.2.对字符串进行编码再解码
2.碎碎念
2.1.byte转换成int型
2.2.Unicode与iso-8859-1相互转换
2.3.输出十六进制
对某类中文乱码问题的复现和处理的演示
为什么使用iso-8859-1进行编码
这也是许多中文乱码问题的原因之一,事实上这对英文字符是没有影响的,因为它们是单字节编码并且在众多编码中的表示都是一样的
字节通过iso-8859-1解码成Unicode值只需要在前面添加全零字节即可。
JAVA按字节读取文件的简单实例
09-01
注意,这里我们没有直接使用`in.read(bytes)`,因为`read()`方法默认一次只读取一个字节,而`read(bytes)`会尝试读取整个数组。在循环中,每次读取一个字节,直到文件结束。 在完成读取后,必须关闭输入流以释放...
java——IO流----字节流、字节输入流、读取单个,多个字节、字符输出流、文件复制、续写和换行
m0_52196529的博客
11-07
514
java——IO流、字节流、字节输入流、读取单个,多个字节、字符输出流、文件复制、续写和换行、Properties类
用Java将文件读入字节数组的7个示例
最佳 Java 编程
06-17
4237
嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本或二进制文件。 一个示例是将文件的内容转换为String以便显示。 不幸的是,用于表示文件和目录的Java的File类没有方法toByteArray() 。 它仅保存路径,并允许您执行某些操作,例如打开和关闭文件,但不允许直接将File转换为字节数组 。 无论如何,无需担心,因为还...
java 读取文件inputstream_使用Inputstream读取文件
weixin_35802571的博客
02-12
1万+
在java中,可以使用InputStream对文件进行读取,就是字节流的输入。当读取文件内容进程序时,需要使用一个byte数组来进行存储,如此会有如下两个问题:1.如何建立合适大小的byte数组,如果已知输入流的大小。2.如果不知输入流的大小,则肯定需要建立一个很大的byte数组,那么byte中很可能有空的内容,那么如何正确合适的将byte数组的中的内容输出?先看第一个问题:解决之道就是获取输入流...
读取InputStream 中的内容
adlc17416的博客
07-10
1372
读取InputStream 中的内容 /** * 读取 InputStream 到 String字符串中 */ public static String readStream(InputStream in) { try { //<1>创建字节数组输出流,用来输出读取到的内容 ByteArrayOutp...
20.1 Java读文件之InputStream学习
c1776167012的博客
10-08
7345
在JavaAPI中,我们可以从字节序列来源地读入一个字节序列的对象称为输入流。字节序列的来源地可以是文件,也可以是网络,还可以是内存块等等。输入流根据每次读取的字节数量的不同分为字节输入流和字符输入流。字节输入流每次都是读取一个字节的,而字符输入流每次读入都是根据基于两字节的字符为单位读取的。方法定义返回值描述方法描述返回的是读入的字节asc码(-1~225)当读取完毕时,返回-1将源中的字节信息填充到b中当填充完毕时,返回实际填充数将b中指定位置填充源中的字节。
Java技能点--InputStream文件读取
热门推荐
程序员大阳
08-14
2万+
一,知识点1,InputStream是输入流的抽象基类,定义了输入流应该实现的方法。2,很重要的一个方法是read(byte[] buffer,int offset,int length),三个参数分别代表读到哪,从当前位置开始读取的偏移,读取长度。3,一定要注意编码,比如UTF-8中中文一般占3个字节,数字和英文字母占一个字节,其他编码就不一定了,如果读取中文时length设置为1,那么显示读取中
java InputStream读取数据
大飞的江湖
12-06
2万+
InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。
/**
* 读取流
*
* @param inStream
* @return 字节数组
* @throws Excepti
java 读取inputstream_利用流读取文件中的内容(InputStream)
weixin_29417071的博客
02-20
3927
读取上述文件中内容。运行后实际读取位置: 两种方式:1:getClassLoader方式public static void main(String[] args) {//当前页面的类名EsTestClassLoader classLoader = new EsTest().getClass().getClassLoader();InputStream resourceAsStream = cla...
【java】之读取InputStream流
weixin_34779096的博客
08-24
109
如这个文件登录后复制 @Test
public void test01() throws Exception{
InputStream in=new FileInputStream("c://test.txt");
byte[] b=new byte[1024];
...
java读取输入流
ddak56357的博客
12-08
1043
java读取输入流两种
private static byte[] readStream(InputStream in){
if(in==null){
return null;
}
byte[] buffer = null;
try {
...
从InputStream读取的字节数组
最新发布
07-17
1. 使用InputStream的read(byte[])方法循环读取直到流结束(适合任意大小的流,避免一次性读取大文件导致内存溢出)
2. 使用Apache Commons IO库中的IOUtils.toByteArray()方法(简洁但需要额外依赖)
3. 对于已知大小的流,可以直接创建对应大小的字节数组(如引用[3]所示,但注意文件大小不能超过整数最大值且必须知道确切大小)
下面提供几种不同的实现方式:
方法一:使用循环读取(推荐,通用且安全)
这是最通用的方法,可以处理任意大小的输入流,通过循环读取避免一次性加载大文件导致内存溢出。
```java
public static byte[] readAllBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[4096]; // 缓冲区大小,可根据需要调整
int nRead;
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
```
方法二:使用Java 9+的InputStream.readAllBytes()(最简单,但要求Java 9+)
如果运行环境是Java 9及以上,可以直接使用InputStream的内置方法:
```java
byte[] bytes = inputStream.readAllBytes();
```
方法三:使用Apache Commons IO(需要添加依赖)
如果项目中已经使用了Apache Commons IO库,可以使用IOUtils工具类:
```java
// 需要添加依赖:commons-io
byte[] bytes = IOUtils.toByteArray(inputStream);
```
方法四:已知流大小(如文件流,且文件大小不超过2GB)
如引用[3]所示,适用于文件流且已知文件大小的情况:
```java
public static byte[] readFile(String file) throws IOException {
File f = new File(file);
// 注意:文件大小不能超过Integer.MAX_VALUE(约2GB)
byte[] buffer = new byte[(int) f.length()];
FileInputStream is = new FileInputStream(file);
// 注意:read方法可能不会一次性读完,需要检查返回值
int bytesRead = is.read(buffer);
if (bytesRead != buffer.length) {
throw new IOException("没有完全读取文件");
}
is.close();
return buffer;
}
```
但注意,上述方法四不适用于任意输入流(比如网络流可能无法提前知道大小),且必须确保一次读取完成。
推荐使用方法一(循环读取)或方法二(Java 9+)来读取字节数组。
注意事项:
1. 所有方法都需要在读取完毕后关闭流(或者在调用方关闭,或者使用try-with-resources)。
2. 对于大文件,使用方法一(循环读取)并调整缓冲区大小可以平衡内存和性能。
示例:使用循环读取方法(方法一)处理网络流
```java
URL url = new URL("https://example.com/image.jpg");
try (InputStream inputStream = url.openStream()) {
byte[] bytes = readAllBytes(inputStream);
// 使用bytes...
}
```
相关问题:
1. 如何将字节数组转换回InputStream?
2. 在Java中如何高效地处理大文件流(超过内存大小)?
3. 如何将InputStream转换为字符串?
4. 使用BufferedInputStream有什么好处?### Java InputStream 读取字节数组的代码示例
以下是几种将 InputStream 转换为字节数组的常用方法,适用于不同场景:
#### 1. 基础循环读取(推荐通用方案)
```java
public static byte[] readAllBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[4096]; // 缓冲区大小
int bytesRead;
while ((bytesRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, bytesRead);
}
buffer.flush();
return buffer.toByteArray();
}
```
**特点**:
- 适用于任意大小的流(自动处理大文件)
- 内存效率高(使用固定缓冲区)
- Java 7+ 兼容 [^1]
#### 2. Java 9+ 内置方法(最简洁)
```java
// Java 9+ 专用
byte[] bytes = inputStream.readAllBytes();
```
**特点**:
- 单行代码实现
- 官方内置方法
- 仅限 Java 9+ 环境
#### 3. Apache Commons IO 方案
```java
// 需要依赖:commons-io
byte[] bytes = IOUtils.toByteArray(inputStream);
```
**特点**:
- 简洁高效
- 需添加库依赖
- 自动处理异常和资源关闭 [^2]
#### 4. 文件专用方案(已知文件大小)
```java
public static byte[] readFile(File file) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[(int) file.length()];
fis.read(buffer); // 一次性读取
return buffer;
}
}
```
**限制**:
- 仅适用于文件流
- 文件大小需 $\leq 2\text{GB}$(数组长度限制)
- 不适用于网络流等未知长度的流 [^3]
### 使用示例
```java
try (InputStream is = new FileInputStream("test.jpg")) {
// 方法1:循环读取
byte[] imageData = readAllBytes(is);
// PDFBox 图片加载应用
PDImageXObject pdImage = PDImageXObject.createFromByteArray(
document, imageData, "image"
);
} catch (IOException e) {
e.printStackTrace();
}
```
### 关键注意事项
1. **资源管理**:始终使用 `try-with-resources` 确保流关闭
2. **大文件处理**:
- 超过 $2\text{GB}$ 文件必须使用循环读取
- 设置缓冲区大小(建议 $4\text{KB} \sim 64\text{KB}$)
3. **编码问题**:
```java
String text = new String(bytes, StandardCharsets.UTF_8); // 字节转字符串
```
4. **性能优化**:
```java
// 添加缓冲层提升读取效率
try (InputStream bis = new BufferedInputStream(rawStream)) {
byte[] data = readAllBytes(bis);
}
```
> **内存警告**:处理大文件时,避免一次性读取未知长度的流到内存,可能导致 `OutOfMemoryError`[^1]。