如何从字符串创建 InputStream? [复制]
Posted
技术标签:
【中文标题】如何从字符串创建 InputStream? [复制]【英文标题】:How does one create an InputStream from a String? [duplicate] 【发布时间】:2011-08-08 21:31:20 【问题描述】:我不习惯在 Java 中使用流 - 如何从 String
创建 InputStream
?
【问题讨论】:
你将如何使用从 String 创建的 InputStream? 【参考方案1】:给你:
InputStream is = new ByteArrayInputStream( myString.getBytes() );
更新对于多字节支持使用(感谢Aaron Waibel的评论):
InputStream is = new ByteArrayInputStream(Charset.forName("UTF-16").encode(myString).array());
请参阅ByteArrayInputStream 手册。
在上述String#getBytes(charset) 方法中使用字符集参数是安全的。
JDK 7+之后就可以使用了
java.nio.charset.StandardCharsets.UTF_16
而不是硬编码的编码字符串:
InputStream is = new ByteArrayInputStream(StandardCharsets.UTF_16.encode(myString).array());
【讨论】:
这将导致除 0x00 之外的第一个字节的字符被修剪,更准确地说,你应该这样做InputStream is = new ByteArrayInputStream(Charset.forName("UTF-16").encode(myString()).array())
@Aaron: 不,String.getBytes()
将使用平台默认编码(可能是也可能不是你想要的那个)。对我来说,这是 UTF-8(可以编码所有 Java 字符串)。正确的答案是“指明你真正想要的编码”,而不是“使用 UTF-16”。您可以将它与.getBytes(charsetName)
一起使用,不必显式创建 Charset 对象并将字符串编码为 ByteBuffer。
不使用 String.getBytes 怎么样?它分配字符串的副本,因此它不是内存有效的解决方案。使用 inputstream 的原因通常是为了避免在内存中保留大对象的副本
这个答案可以更新为提及java.nio.charset.StandardCharsets.UTF_16
。
好建议@kevinarpe,我已编辑。【参考方案2】:
你可以这样做:
InputStream in = new ByteArrayInputStream(string.getBytes("UTF-8"));
注意UTF-8
编码。您应该指定要将字节编码到的字符集。如果您没有特别需要其他任何东西,通常选择UTF-8
。否则,如果您不选择任何内容,您将获得可能因系统而异的默认编码。来自JavaDoc:
当此字符串无法以默认字符集编码时,此方法的行为未指定。当需要对编码过程进行更多控制时,应使用 CharsetEncoder 类。
【讨论】:
【参考方案3】:InputStream in = new ByteArrayInputStream(yourstring.getBytes());
【讨论】:
【参考方案4】:使用来自 Google 的 Guava (http://code.google.com/p/guava-libraries/wiki/StringsExplained#Charsets) 的 com.google.common.base.Charsets 代替 CharSet.forName 稍微好一些:
InputStream is = new ByteArrayInputStream( myString.getBytes(Charsets.UTF_8) );
当然,您使用哪个 CharSet 完全取决于您要对 InputStream 做什么。
【讨论】:
【参考方案5】:Java 7+
可以利用StandardCharsets
JDK 类:
String str=...
InputStream is = new ByteArrayInputStream(StandardCharsets.UTF_16.encode(str).array());
【讨论】:
【参考方案6】:从 Java 7 开始,您可以使用以下成语:
String someString = "...";
InputStream is = new ByteArrayInputStream( someString.getBytes(StandardCharsets.UTF_8) );
【讨论】:
以上是关于如何从字符串创建 InputStream? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中将字符串读入 inputStream? [复制]
Java如何从InputStream中读取收入大小? [复制]
从来自 java 中 InputStream 的字符串创建 Spark RDD 或数据帧