Javaで文字列をInputStreamReaderに変換するにはどうすればよいですか?


回答:


327

ByteArrayInputStreamもトリックを行います:

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

次に、リーダーに変換します。

InputStreamReader reader = new InputStreamReader(is);

3
あなたは可能性がしたいプラットフォームのデフォルト文字セットを継承します。
スリム

2
ありがとう。できました。Plataformのデフォルトの文字セットを検出する最良の方法は何ですか?
グイド

5
または、パラメータなしでgetBytes()を使用します...おそらく存在しないはずですが、デフォルトのエンコーディングを使用します。
Michael Borgwardt

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 []またはその逆に変換することは、ほとんどの場合バグです。
ヨアヒムザウアー

1
これにより、デフォルトのプラットフォームエンコーディングと文字列内の文字によっては、データが失われる可能性があります。エンコード操作とデコード操作の両方にUnicodeエンコードを指定することをお勧めします。詳細については、こちらをお読みください。illegalargumentexception.blogspot.com
McDowell

エンコーディングパラメータは、特定のエンコーディングでバイトを取得するために必要なだけではありませんか?String#getBytes呼び出しに、InputSTreamReaderコンストラクターと同じエンコーディングを選択する限り、どちらを選択するかは重要ではないと思います。ヨアヒムとマクダウェルは、この特定のケースでは間違っていると確信しています。文字列の周りにInputStreamReaderをラップするためにエンコードの知識は必要ありません。
Stijn de Witt

4
@Stijn de Witt-遅ればせながら私は知っているが、私はこれを見た。デフォルトのプラットフォームエンコーディングが文字列のコードポイントをサポートしていない場合、データが失われます。デフォルトのエンコーディングがUTF-8の場合、問題ありません。Windowsで実行している場合、これらのJREはデフォルトでレガシーの「ANSI」エンコーディングに設定されているため、ほとんどのUnicodeセットが失われます。証明は私が投稿したリンクにあります。new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")ロスレスになります。
McDowell

フーレイ、サードパーティのライブラリを使用してワンライナーを…より大きなワンライナーに変えます。バイトをsに戻すためのStringaのbyte[]配列への無用な変換については言わないでくださいchar
Holger

32

具体的にはInputStreamReaderである必要がありますか?StringReaderの使用についてはどうですか?

それ以外の場合は、StringBufferInputStreamを使用できますが、文字変換の問題があるため非推奨になっています(そのため、StringReaderを優先する必要があります)。


16

@Danと同じ質問-なぜStringReaderでないのですか?

InputStreamReaderにする必要がある場合は、次のようにします。

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

いいですが、2行目はbyte[] bytes = charset.getBytes();
AabinGunzの

1
アビシェクはそうは思わない。私の例では、stringは、InputStreamReaderを使用してアクセスするStringのインスタンスです。
ツールキット、

3

a)Reader機能を利用しようとしていますInputStreamReaderか、それともb)InputStream機能を利用しようとしていますInputStreamReaderか?b)は取得できません。 InputStreamReaderはありませんInputStream

の目的はInputStreamReaderInputStream-バイトのソース- を取得し、バイトをの形式で文字にデコードすることReaderです。データはすでに文字(元の文字列)として保持されています。文字列をバイトにエンコードし、バイトを文字にデコードして戻す操作は冗長な操作になります。

あなたが取得しようとしている場合はReader、あなたのソースのうちに、使用StringReader

InputStream(バイトしか得られない)を取得しようとしている場合IOUtils.toInputStream(..)は、他の回答で提案されているように、Apache Commons を使用してください。


2

Cactoosを試すことができます

InputStream stream = new InputStreamOf(str);

次に、必要な場合Reader

Reader reader = new ReaderOf(stream);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.