J'ai un String
fichier que je souhaite utiliser comme fichier InputStream
. Dans Java 1.0, vous pouvez utiliser java.io.StringBufferInputStream
, mais cela a été @Deprecrated
(avec raison - vous ne pouvez pas spécifier le codage du jeu de caractères):
Cette classe ne convertit pas correctement les caractères en octets. Depuis JDK 1.1, la méthode préférée pour créer un flux à partir d'une chaîne est via la
StringReader
classe.
Vous pouvez créer un java.io.Reader
avec java.io.StringReader
, mais il n'y a pas d'adaptateurs pour prendre un Reader
et créer un InputStream
.
J'ai trouvé un ancien bug demandant un remplacement approprié, mais rien de tel n'existe - pour autant que je sache.
La solution de contournement souvent suggérée consiste à utiliser java.lang.String.getBytes()
comme entrée pour java.io.ByteArrayInputStream
:
public InputStream createInputStream(String s, String charset)
throws java.io.UnsupportedEncodingException {
return new ByteArrayInputStream(s.getBytes(charset));
}
mais cela signifie matérialiser le tout String
en mémoire comme un tableau d'octets, et va à l'encontre de l'objectif d'un flux. Dans la plupart des cas, ce n'est pas un gros problème, mais je cherchais quelque chose qui préserverait l'intention d'un flux - que le moins de données possible soit (re) matérialisé en mémoire.
la source
new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))
Si une dépendance sur le package commons-io ne vous dérange pas , vous pouvez utiliser la méthode IOUtils.toInputStream (String text) .
la source
Il existe un adaptateur d'Apache Commons-IO qui s'adapte de Reader à InputStream, appelé ReaderInputStream .
Exemple de code:
Référence: https://stackoverflow.com/a/27909221/5658642
la source
À mon avis, le moyen le plus simple de le faire est de transmettre les données à un Writer:
L'implémentation JVM que j'utilise avec des données poussées par blocs de 8K, mais vous pourriez avoir un effet sur la taille de la mémoire tampon en réduisant le nombre de caractères écrits en même temps et en appelant flush.
Une alternative à l'écriture de votre propre wrapper CharsetEncoder pour utiliser un Writer pour encoder les données, bien que ce soit quelque chose de pénible à faire correctement. Cela devrait être une implémentation fiable (si inefficace):
la source
Eh bien, une façon possible est de:
PipedOutputStream
PipedInputStream
OutputStreamWriter
autour duPipedOutputStream
(vous pouvez spécifier l'encodage dans le constructeur)OutputStreamWriter
peut être lu à partir duPipedInputStream
!Bien sûr, cela semble être une façon plutôt hackish de le faire, mais au moins c'est une façon.
la source
Une solution consiste à générer la vôtre, en créant une
InputStream
implémentation qui utiliserait probablementjava.nio.charset.CharsetEncoder
pour encoder chaquechar
ou morceau dechar
s en un tableau d'octets pour leInputStream
si nécessaire.la source
Vous pouvez prendre l'aide de la bibliothèque org.hsqldb.lib.
la source
Je sais que c'est une vieille question mais j'ai moi-même eu le même problème aujourd'hui, et c'était ma solution:
la source