Java 将ByteArrayInputStream的内容转换为字符串
我读书,但我没有听懂。我已经看到但还没有看到使用Java 将ByteArrayInputStream的内容转换为字符串,java,string,bytearrayoutputstream,bytearrayinputstream,Java,String,Bytearrayoutputstream,Bytearrayinputstream,我读书,但我没有听懂。我已经看到但还没有看到使用ByteArrayInputStream将ByteArrayInputStream转换为String的正确示例 要将ByteArrayInputStream的内容检索为字符串,建议使用ByteArrayOutputstream还是有更可取的方法 我正在考虑通过tearrayinputstream扩展,并在运行时利用a来增加功能。如果有兴趣使用ByteArrayInputStream?使用Scanner并将ByteArrayInputStream传递
ByteArrayInputStream
将ByteArrayInputStream
转换为String
的正确示例
要将ByteArrayInputStream
的内容检索为字符串
,建议使用ByteArrayOutputstream
还是有更可取的方法
我正在考虑通过tearrayinputstream扩展
,并在运行时利用a来增加功能。如果有兴趣使用ByteArrayInputStream
?使用Scanner
并将ByteArrayInputStream
传递给其构造函数,然后从扫描仪读取数据,请检查此示例:
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 });
Scanner scanner = new Scanner(arrayInputStream);
scanner.useDelimiter("\\Z");//To read all scanner content in one String
String data = "";
if (scanner.hasNext())
data = scanner.next();
System.out.println(data);
一个ByteArrayOutputStream
可以从任何InputStream
读取,并在最后生成一个字节[]
但是,使用ByteArrayInputStream
更简单:
int n = in.available();
byte[] bytes = new byte[n];
in.read(bytes, 0, n);
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding.
对于ByteArrayInputStream
available()
生成总字节数
回复评论:使用ByteArrayOutputStream
使用Base64编码
假设您获得了ByteArrayOutputStream:
ByteArrayOutputStream baos =...
String s = new String(Base64.Encoder.encode(baos.toByteArray()));
参见为什么没有人提到org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
String result = IOUtils.toString(in, StandardCharsets.UTF_8);
只需一行代码。Java 9+解决方案:
new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
您可能需要一个InputStreamReader
,如您提供的第二个链接所述。ByteArrayInputStream
不会将字节转换为字符。您真的有ByteArrayInputStream(这意味着您有一个字节[])还是只有一个InputStream?@BrettOkken我真的有一个ByteArrayInputStream,其构造函数被传递一个字节数组(大小不同)@DavidWallace在第二个链接中使用InputstreamReader回复了这篇文章:问题在于它只能读取第一行分隔符。它假定您要查找的字符串不包含任何行分隔符。通常这是正确的,但如果不是,这将不会真正起作用。
为什么我不继续这个例子。但你可以一直从中读取,直到它为空。如果我有XML
或HTML
文档,我能不受限制地读取它吗?是的,没有限制。ByteArrayInputStream如何读取ByteArrayInputStream?我已经扩展了答案。原则上,可以循环读取输入流
,然后通过tearrayoutputstream写入。传统上,I/O缓冲区的常规大小为2次方。同意2次方大小;我喜欢并感谢您。从函数的javadoc来看:使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是永远不正确的。@nucatus true,我没有声明中的是ByteArrayInputStream
。一个五月。很好的解决方案。但是,我需要首先将ByteArrayInputStream连接到ByteArrayOutStream。这是如何实现的?重要的是Base64.Encoder是在Java8中发布的它应该是字符串s=新字符串(Base64.getEncoder().encode(bas.toByteArray());谢谢。正如@SiddharthGharge所说,编码器的创建是错误的。还有一个问题是关于InputStream,而不是OutputStream。我添加了两个必需的import
语句,以便不是每个人都必须搜索它们。很抱歉它不再只是一行代码;)对不起,我认为这个答案不正确。因为如果您的输入是ByteArrayInputStream,您将得到编译错误。此函数的正确输入是InputStream
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
String result = IOUtils.toString(in, StandardCharsets.UTF_8);
new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);