Wie verwandle ich einen String in einen InputStreamReader in Java?

281

Wie kann ich einen StringWert in einen Wert umwandeln InputStreamReader?

Yossale
quelle

Antworten:

327

ByteArrayInputStream macht auch den Trick:

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

Dann zum Leser konvertieren:

InputStreamReader reader = new InputStreamReader(is);
Guido
quelle
3
Möglicherweise möchten Sie den Standardzeichensatz der Plattform erben.
schlank
2
Vielen Dank. Erledigt. Wie kann der Standardzeichensatz der Plattform am besten erkannt werden?
Guido
5
Oder verwenden Sie einfach getBytes () ohne Parameter ... Wahrscheinlich sollte es nicht existieren, aber es wird die Standardcodierung verwendet.
Michael Borgwardt
1
ByteArrayInputStream : Seit: JDK1.0 Es gibt nicht den geringsten Grund anzunehmen, dass diese Klasse "seit Java 1.4" ist. Diese falsche Versionsnummer ist besonders seltsam, als Java 1.4 eingeführt wurde, NIOund es macht wenig Sinn, eine API und ihren konzeptionellen Nachfolger in derselben Version einzuführen.
Holger
61

Ich habe auch die Apache Commons- IOUtilsKlasse gefunden, also:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
quelle
35
Das Konvertieren von String-> Byte [] oder umgekehrt ohne Erwähnung einer Zeichenkodierung ist fast immer ein Fehler.
Joachim Sauer
1
Dies kann abhängig von der Standardplattformcodierung und den Zeichen in der Zeichenfolge zu Datenverlust führen. Es wäre besser, eine Unicode-Codierung sowohl für Codierungs- als auch für Decodierungsvorgänge anzugeben. Lesen Sie dies für weitere Details: illegalargumentexception.blogspot.com/2009/05/…
McDowell
Wird der Codierungsparameter nicht nur benötigt, um Bytes in einer bestimmten Codierung abzurufen? Ich denke, solange Sie für den Aufruf von String # getBytes dieselbe Codierung auswählen wie für den InputSTreamReader-Konstruktor, spielt es keine Rolle, welche Sie auswählen. Ich bin mir ziemlich sicher, dass Joachim und McDowell in diesem speziellen Fall falsch liegen. Es sind keine Codierungskenntnisse erforderlich, um einen InputStreamReader um einen String zu wickeln.
Stijn de Witt
4
@Stijn de Witt - verspätete Antwort Ich weiß, aber ich habe das gerade gesehen. Wenn die Standardplattformcodierung die Codepunkte in der Zeichenfolge nicht unterstützt, kommt es zu Datenverlust. Wenn Ihre Standardcodierung UTF-8 ist, ist dies kein Problem. Wenn Sie unter Windows ausgeführt werden, verlieren Sie den größten Teil des Unicode-Satzes, da diese JREs standardmäßig ältere "ANSI" -Codierungen verwenden. Der Beweis ist in dem Link, den ich gepostet habe. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")wäre verlustfrei.
McDowell
Hurra, verwenden Sie eine Bibliothek eines Drittanbieters, um einen Einzeiler in einen größeren Einzeiler zu verwandeln. Ganz zu schweigen von der nutzlosen Umwandlung von a Stringin ein byte[]Array, um die Bytes dann wieder in chars umzuwandeln ...
Holger
32

Muss es sich speziell um einen InputStreamReader handeln? Wie wäre es mit StringReader ?

Andernfalls könnten Sie StringBufferInputStream verwenden , der jedoch aufgrund von Problemen bei der Zeichenkonvertierung veraltet ist (weshalb Sie StringReader bevorzugen sollten).

Dan Dyer
quelle
16

Gleiche Frage wie @Dan - warum nicht StringReader?

Wenn es InputStreamReader sein muss, dann:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
Toolkit
quelle
Schön, aber die 2. Zeile sollte seinbyte[] bytes = charset.getBytes();
AabinGunz
1
Ich glaube nicht, Abhishek. In meinem Beispiel ist string die Instanz von String, auf die Sie mit einem InputStreamReader zugreifen möchten.
Toolkit
3

Versuchen Sie, a) ReaderFunktionalität aus InputStreamReaderoder b) InputStreamFunktionalität herauszuholen InputStreamReader? Sie werden nicht b) bekommen. InputStreamReaderist kein InputStream.

Der Zweck von InputStreamReaderist es, eine InputStream- eine Quelle von Bytes - zu nehmen und die Bytes in Form von a in Zeichen zu dekodieren Reader. Sie haben Ihre Daten bereits als Zeichen (Ihre ursprüngliche Zeichenfolge). Das Codieren Ihres Strings in Bytes und das Zurückcodieren der Bytes in Zeichen wäre eine redundante Operation.

Wenn Sie versuchen, Readeraus Ihrer Quelle herauszukommen, verwenden SieStringReader .

Wenn Sie versuchen, ein InputStream(das Ihnen nur Bytes gibt) zu erhalten, verwenden Sie Apache Commons, IOUtils.toInputStream(..)wie in anderen Antworten hier vorgeschlagen.

Fai Ng
quelle
2

Sie können Kakteen ausprobieren :

InputStream stream = new InputStreamOf(str);

Wenn Sie dann Folgendes benötigen Reader:

Reader reader = new ReaderOf(stream);
yegor256
quelle