如何将一个字符串转换为java中的InputStreamReader?

293

如何将String值转换为InputStreamReader

6个回答

337

ByteArrayInputStream同样可行:

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

然后转换为读取器:

InputStreamReader reader = new InputStreamReader(is);

3
你可能希望继承平台的默认字符集。 - slim
2
谢谢。完成。检测平台默认字符集的最佳方法是什么? - Guido
5
可以只使用getBytes()方法而不传递参数...有人可能会认为这个方法不应该存在,但它会使用默认编码。 - Michael Borgwardt
1
ByteArrayInputStream自从JDK1.0以来。没有任何理由认为这个类是“自Java 1.4以来”的。那个错误的版本号特别奇怪,因为Java 1.4引入了NIO,在同一个版本中引入API及其概念上的继承者是没有多少意义的。 - Holger

64
我还发现了 Apache Commons 中的 IOUtils 类,因此:
InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

36
没有提及字符编码就转换String->byte[]或byte[]->String几乎总是一个错误。 - Joachim Sauer
1
这可能会导致数据丢失,具体取决于默认平台编码和字符串中的字符。为编码和解码操作指定Unicode编码会更好。阅读此内容以获取更多详细信息:http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_lossyconversions - McDowell
编码参数不仅仅是为了以特定编码获取字节吗?我认为只要在String#getBytes调用中选择与InputStreamReader构造函数相同的编码,选择哪个编码并不重要。对于这种特定情况,我很确定Joachim和McDowell是错误的。在字符串周围包装InputStreamReader时不需要编码知识。 - Stijn de Witt
4
如果默认平台编码不支持字符串中的代码点,则会导致数据丢失。如果您的默认编码是UTF-8,则没有问题。如果您在Windows上运行,则会丢失大多数Unicode集,因为这些JRE默认使用传统的“ANSI”编码。我在链接中提供了证据。new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")可以保证无损转换。 - McDowell
太好了,使用第三方库将一行代码转换成更长的一行代码。更不用说将String转换为byte[]数组再将字节转换回char的无用转换了。 - Holger
实际上看一下实现代码:IOUtils.toInputStream(myString, StandardCharsets.UTF_8) 也只是创建了一个 ByteArrayInputStream:new ByteArrayInputStream(input.getBytes(Charsets.toCharset(encoding))) - Matthias B

34

它必须是一个InputStreamReader吗?使用StringReader如何?

否则,您可以使用StringBufferInputStream,但它已被弃用,因为存在字符转换问题(这就是为什么应该优先选择StringReader的原因)。


17

@Dan一样的问题 - 为什么不使用StringReader?

如果必须使用InputStreamReader,则:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);

不错,但第二行应该是 byte[] bytes = charset.getBytes(); - AabinGunz
1
我不这么认为,Abhishek。在我的例子中,字符串是您希望使用InputStreamReader访问的String实例。 - toolkit

4
你是想从InputStreamReader中获得a)Reader功能,还是b)InputStream功能?你不会得到b)。InputStreamReader不是一个InputStreamInputStreamReader的目的是将字节源InputStream解码为字符形式的Reader。你已经有了原始字符串的字符数据。将你的字符串编码为字节,然后再将字节解码回字符将是一种多余的操作。
如果你想从源中获取Reader,请使用StringReader
如果你想获得一个只提供字节的InputStream,可以使用其他答案中建议的apache commons IOUtils.toInputStream(..)

2

您可以尝试使用Cactoos

InputStream stream = new InputStreamOf(str);

如果需要一个Reader

Reader reader = new ReaderOf(stream);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接