Comment puis-je transformer une chaîne en un InputStreamReader en Java?

281

Comment puis-je transformer une Stringvaleur en un InputStreamReader?

Yossale
la source

Réponses:

327

ByteArrayInputStream fait également l'affaire:

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

Convertissez ensuite en lecteur:

InputStreamReader reader = new InputStreamReader(is);
Guido
la source
3
Vous souhaiterez peut - être hériter du jeu de caractères par défaut de la plate-forme.
slim
2
Merci. Terminé. Quelle est la meilleure façon de détecter le jeu de caractères par défaut de la plate-forme?
Guido
5
Ou utilisez simplement getBytes () sans paramètre ... Il ne devrait pas exister, mais il utilisera l'encodage par défaut.
Michael Borgwardt
1
ByteArrayInputStream : Depuis: JDK1.0 Il n'y a pas la moindre raison de supposer que cette classe est "depuis Java 1.4". Ce mauvais numéro de version est particulièrement étrange lors de l'introduction de Java 1.4 NIOet il n'a pas de sens d'introduire une API et son successeur conceptuel dans la même version.
Holger
61

J'ai également trouvé la IOUtilsclasse apache commons , donc:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
la source
35
Convertir String-> byte [] ou vice versa sans mentionner un encodage de caractères est presque toujours un bug.
Joachim Sauer
1
Cela peut entraîner une perte de données, selon l'encodage de la plate-forme par défaut et les caractères de la chaîne. Il serait préférable de spécifier un codage Unicode pour les opérations de codage et de décodage. Lisez ceci pour plus de détails: illegalargumentexception.blogspot.com/2009/05/…
McDowell
Le paramètre de codage n'est-il pas simplement nécessaire pour obtenir des octets dans un certain codage? Je pense que tant que vous choisissez le même encodage pour l'appel String # getBytes que vous choisissez pour le constructeur InputSTreamReader, peu importe celui que vous choisissez. Je suis à peu près sûr que Joachim et McDowell ont tort dans ce cas spécifique. Aucune connaissance d'encodage nécessaire pour encapsuler un InputStreamReader autour d'une chaîne.
Stijn de Witt
4
@Stijn de Witt - réponse tardive je sais, mais je viens de voir ça. Si le codage de plate-forme par défaut ne prend pas en charge les points de code dans la chaîne, une perte de données en résultera. Si votre encodage par défaut est UTF-8, pas de problème. Si vous exécutez sous Windows, vous perdriez la majeure partie de l'ensemble Unicode, car ces JRE utilisent par défaut les encodages "ANSI" hérités. La preuve est dans le lien que j'ai posté. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")serait sans perte.
McDowell
hourra, en utilisant une bibliothèque tierce pour transformer un one-liner en… un plus grand one-liner. Sans parler de la conversion inutile d'un Stringen un byte[]tableau pour reconvertir les octets en chars alors…
Holger
32

Doit-il être spécifiquement un InputStreamReader? Que diriez-vous d'utiliser StringReader ?

Sinon, vous pourriez utiliser StringBufferInputStream , mais il est obsolète en raison de problèmes de conversion de caractères (c'est pourquoi vous devriez préférer StringReader).

Dan Dyer
la source
16

Même question que @Dan - pourquoi pas StringReader?

Si ce doit être InputStreamReader, alors:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
boîte à outils
la source
byte[] bytes = charset.getBytes();
Bien
1
Je ne pense pas, Abhishek. Dans mon exemple, string est l'instance de String à laquelle vous souhaitez accéder à l'aide d'un InputStreamReader.
boîte à outils
3

Essayez-vous de retirer a) des Readerfonctionnalités deInputStreamReader ou b) des InputStreamfonctionnalités InputStreamReader? Vous n'obtiendrez pas b). InputStreamReadern'est pas un InputStream.

Le but de InputStreamReaderest de prendre un InputStream- une source d'octets - et de décoder les octets en caractères sous la forme d'un Reader. Vous avez déjà vos données sous forme de caractères (votre chaîne d'origine). L'encodage de votre chaîne en octets et le décodage des octets en chars serait une opération redondante.

Si vous essayez de tirer Readerparti de votre source, utilisezStringReader .

Si vous essayez d'obtenir un InputStream(qui ne vous donne que des octets), utilisez apache commons IOUtils.toInputStream(..)comme suggéré par d'autres réponses ici.

Fai Ng
la source
2

Vous pouvez essayer Cactoos :

InputStream stream = new InputStreamOf(str);

Ensuite, si vous avez besoin d'un Reader:

Reader reader = new ReaderOf(stream);
yegor256
la source