【发布时间】:2011-08-08 21:31:20
【问题描述】:
我不习惯在 Java 中使用流 - 如何从 String 创建 InputStream?
【问题讨论】:
-
你将如何使用从 String 创建的 InputStream?
我不习惯在 Java 中使用流 - 如何从 String 创建 InputStream?
【问题讨论】:
给你:
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());
【讨论】:
InputStream is = new ByteArrayInputStream(Charset.forName("UTF-16").encode(myString()).array())
String.getBytes() 将使用平台默认编码(可能是也可能不是你想要的那个)。对我来说,这是 UTF-8(可以编码所有 Java 字符串)。正确的答案是“指明你真正想要的编码”,而不是“使用 UTF-16”。您可以将它与.getBytes(charsetName) 一起使用,不必显式创建 Charset 对象并将字符串编码为 ByteBuffer。
java.nio.charset.StandardCharsets.UTF_16。
你可以这样做:
InputStream in = new ByteArrayInputStream(string.getBytes("UTF-8"));
注意UTF-8 编码。您应该指定要将字节编码到的字符集。如果您没有特别需要其他任何东西,通常选择UTF-8。否则,如果您不选择任何内容,您将获得可能因系统而异的默认编码。来自JavaDoc:
当此字符串无法以默认字符集编码时,此方法的行为未指定。当需要对编码过程进行更多控制时,应使用 CharsetEncoder 类。
【讨论】:
InputStream in = new ByteArrayInputStream(yourstring.getBytes());
【讨论】:
使用来自 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 做什么。
【讨论】:
Java 7+
可以利用StandardCharsets JDK 类:
String str=...
InputStream is = new ByteArrayInputStream(StandardCharsets.UTF_16.encode(str).array());
【讨论】:
从 Java 7 开始,您可以使用以下成语:
String someString = "...";
InputStream is = new ByteArrayInputStream( someString.getBytes(StandardCharsets.UTF_8) );
【讨论】: