如何在Java中将字符串转换为InputStreamReader?


Answers:


327

ByteArrayInputStream也可以做到这一点:

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

然后转换为阅读器:

InputStreamReader reader = new InputStreamReader(is);

3
您可能想要继承平台的默认字符集。
苗条

2
谢谢。做完了 检测平台的默认字符集的最佳方法是什么?
Guido

5
或者只使用不带参数的getBytes()...可以说它不应该存在,但是它将使用默认编码。
迈克尔博格瓦特

1
ByteArrayInputStream 从以下版本开始: JDK1.0没有丝毫理由假定此类是“自Java 1.4起”。当引入Java 1.4时,该错误的版本号尤其奇怪,NIO在同一版本中引入API及其概念性后继者几乎没有道理。
Holger 2015年

61

我还找到了apache commons IOUtils类,因此:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

35
转换String-> byte []或反之亦然,几乎没有bug。
约阿希姆·绍尔

1
这可能会导致数据丢失,具体取决于默认平台编码和字符串中的字符。为编码和解码操作同时指定Unicode编码会更好。:阅读更多细节illegalargumentexception.blogspot.com/2009/05/...
麦克道尔

只是为了获得某种编码的字节,不是仅需要编码参数吗?我认为,只要为String#getBytes调用选择的编码与为InputSTreamReader构造函数选择的编码相同,选择哪一个都没有关系。我很确定Joachim和McDowell在此特定情况下是错误的。不需要将InputStreamReader封装在String周围的编码知识。
Stijn de Witt 2010年

4
@Stijn de Witt-我知道迟到了,但我只是看到了。如果默认平台编码不支持字符串中的代码点,则将导致数据丢失。如果您的默认编码为UTF-8,则没问题。如果您在Windows上运行,则将丢失大多数Unicode集,因为这些JRE默认为旧式“ ANSI”编码。证明在我发布的链接中。new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")将会是无损的。
McDowell

hooray,使用第3方库将单线变成…更大的单线。更不用说将a String转换为byte[]数组以将字节转换回chars的无用了……
Holger 2015年


16

@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 2011年

1
我不这么认为Abhishek。在我的示例中,string是您希望使用InputStreamReader访问的String的实例。
工具包

3

您是否正在尝试使a)Reader功能失效InputStreamReader,或者b)使InputStream功能失效InputStreamReader?你不会得到b)。 InputStreamReader不是InputStream

的目的InputStreamReader是获取一个InputStream-字节源-并将字节解码为char形式的char Reader。您已经将数据作为chars(原始String)。将您的String编码为字节,然后将字节解码为char将是多余的操作。

如果您试图摆脱Reader困境,请使用StringReader

如果您尝试获取一个InputStream(只能提供字节数),请IOUtils.toInputStream(..)按照此处其他答案的建议使用apache commons 。


2

您可以尝试Cactoos

InputStream stream = new InputStreamOf(str);

然后,如果您需要Reader

Reader reader = new ReaderOf(stream);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.