Comment convertir un lecteur en InputStream et un graveur en OutputStream?

StackOverflow https://stackoverflow.com/questions/62241

  •  09-06-2019
  •  | 
  •  

Question

Existe-t-il un moyen simple d'éviter de traiter les problèmes d'encodage de texte?

Était-ce utile?

La solution

Vous ne pouvez pas vraiment éviter de traiter les problèmes d'encodage de texte, mais il existe des solutions existantes:

Il vous suffit de choisir le codage de votre choix.

Autres conseils

Si vous commencez avec une chaîne, vous pouvez également procéder comme suit:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

Un lecteur traite les caractères et un InputStream traite les octets. Le codage spécifie comment vous souhaitez représenter vos caractères sous forme d'octets, vous ne pouvez donc pas ignorer le problème. Pour éviter les problèmes, mon opinion est la suivante: choisissez un jeu de caractères (par exemple, "UTF-8") et respectez-le.

Pour ce qui est de le faire, comme cela a été souligné, " les noms évidents pour ces classes sont ReaderInputStream et WriterOutputStream . . " Etonnamment, " ces éléments ne sont pas inclus dans la bibliothèque Java ". même si les classes "opposées", InputStreamReader et OutputStreamWriter sont inclus.

Ainsi, de nombreuses personnes ont mis au point leurs propres implémentations, notamment Apache Commons IO . Selon les problèmes de licence, vous pourrez probablement inclure la bibliothèque commons-io dans votre projet, voire même copier une partie du code source (téléchargeable ici ).

Comme vous pouvez le constater, la documentation des deux classes indique que "tous les codages de jeu de caractères pris en charge par le JRE sont gérés correctement".

N.B. Un commentaire sur l'une des autres réponses ici mentionne ce bogue . Mais cela affecte la Ant Apache de la classe ReaderInputStream ( ici ), pas l'Apache Commons IO Classe ReaderInputStream.

Notez également que si vous commencez avec une chaîne, vous pouvez ignorer la création d'un StringReader et créer un InputStream en une étape à l'aide de org.apache.commons.io.IOUtils à partir de Commons IO comme suit:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Bien sûr, vous devez encore penser au codage du texte, mais au moins la conversion se produit en une étape.

Utiliser:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

Cette méthode ne nécessite pas de conversion initiale en String , puis en octet [] , qui alloue beaucoup plus de mémoire en tas, si le rapport est volumineux. Il convertit en octets à la volée lors de la lecture du flux, directement à partir du StringBuffer.

Il utilise CharSequenceInputStream du projet Apache Commons IO.

Les noms évidents pour ces classes sont ReaderInputStream et WriterOutputStream. Malheureusement, ceux-ci ne sont pas inclus dans la bibliothèque Java. Cependant, Google est votre ami.

Je ne suis pas sûr qu'il va régler tous les problèmes d'encodage de texte, qui sont cauchemardesques.

Il existe un RFE mais celui-ci n'est pas fermé. .

Vous ne pouvez pas éviter les problèmes de codage de texte, mais Apache commons-io est

.

Notez que ce sont les bibliothèques mentionnées dans la réponse de Peter à koders.com, juste des liens vers la bibliothèque au lieu du code source.

Essayez-vous d'écrire le contenu d'un Reader dans un OutputStream ? Si c'est le cas, vous aurez plus de facilité à encapsuler OutputStream dans un OutputStreamWriter et à écrire les char à partir du Reader dans Writer au lieu d'essayer de convertir le lecteur en InputStream :

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

Avertissement lors de l'utilisation de WriterOutputStream - il ne gère pas toujours l'écriture de données binaires dans un fichier correctement / de la même manière qu'un flux de sortie normal. J'ai eu un problème avec cela qui m'a pris un certain temps à traquer.

Si vous le pouvez, je vous conseillerais d'utiliser un flux de sortie comme base et, si vous devez écrire des chaînes, utilisez un encapsuleur OUtputStreamWriter autour du flux pour le faire. Il est beaucoup plus fiable de convertir du texte en octets que l’inverse, raison pour laquelle WriterOutputStream ne fait pas partie de la bibliothèque Java standard

Vous pouvez utiliser Cactoos (pas de méthodes statiques, mais uniquement des objets):

Vous pouvez également convertir l'inverse:

Pour lire une chaîne dans un flux en utilisant uniquement les fournitures Java.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top