Ich habe eine String
, die ich als verwenden möchte InputStream
. In Java 1.0 könnten Sie verwenden java.io.StringBufferInputStream
, aber das war @Deprecrated
(aus gutem Grund - Sie können die Zeichensatzcodierung nicht angeben):
Diese Klasse konvertiert Zeichen nicht richtig in Bytes. Ab JDK 1.1 ist die bevorzugte Methode zum Erstellen eines Streams aus einer Zeichenfolge die
StringReader
Klasse.
Sie können ein java.io.Reader
mit erstellen java.io.StringReader
, aber es gibt keine Adapter, um ein zu Reader
erstellen InputStream
.
Ich habe einen alten Fehler gefunden , der nach einem geeigneten Ersatz gefragt hat, aber so etwas gibt es nicht - soweit ich das beurteilen kann.
Die häufig vorgeschlagene Problemumgehung besteht darin, Folgendes java.lang.String.getBytes()
als Eingabe zu verwenden java.io.ByteArrayInputStream
:
public InputStream createInputStream(String s, String charset)
throws java.io.UnsupportedEncodingException {
return new ByteArrayInputStream(s.getBytes(charset));
}
Dies bedeutet jedoch, das gesamte String
Speicher als Array von Bytes zu materialisieren und den Zweck eines Streams zu vereiteln. In den meisten Fällen ist dies keine große Sache, aber ich suchte nach etwas, das die Absicht eines Streams bewahrt - dass so wenig Daten wie möglich im Speicher (wieder) materialisiert werden.
quelle
new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))
Wenn Ihnen eine Abhängigkeit vom commons-io- Paket nichts ausmacht , können Sie die Methode IOUtils.toInputStream (String text) verwenden.
quelle
Es gibt einen Adapter von Apache Commons-IO, der sich von Reader an InputStream anpasst und den Namen ReaderInputStream trägt .
Beispielcode:
Referenz: https://stackoverflow.com/a/27909221/5658642
quelle
Meiner Meinung nach ist es am einfachsten, die Daten durch einen Writer zu übertragen:
Bei der JVM-Implementierung verwende ich Push-Daten in 8-KByte-Blöcken. Sie können jedoch die Puffergröße beeinflussen, indem Sie die Anzahl der gleichzeitig geschriebenen Zeichen verringern und Flush aufrufen.
Eine Alternative zum Schreiben eines eigenen CharsetEncoder-Wrappers zur Verwendung eines Writers zum Codieren der Daten, obwohl es schwierig ist, das Richtige zu tun. Dies sollte eine zuverlässige (wenn auch ineffiziente) Implementierung sein:
quelle
Ein möglicher Weg ist:
PipedOutputStream
PipedInputStream
OutputStreamWriter
diePipedOutputStream
(Sie können die Codierung im Konstruktor angeben)OutputStreamWriter
kann aus demPipedInputStream
!Natürlich scheint dies ein ziemlich hackiger Weg zu sein, aber zumindest ist es ein Weg.
quelle
Eine Lösung besteht darin, eine eigene zu erstellen und eine
InputStream
Implementierung zu erstellen , die wahrscheinlich verwendet wirdjava.nio.charset.CharsetEncoder
, um jedeschar
oder einen Teil vonchar
s nachInputStream
Bedarf in ein Array von Bytes zu codieren .quelle
Sie können die Bibliothek org.hsqldb.lib verwenden.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich hatte heute selbst das gleiche Problem, und dies war meine Lösung:
quelle