Comment faire pour convertir un Lecteur de InputStream et un Écrivain à OutputStream?
Est-il un moyen facile d'éviter de traiter avec des problèmes d'encodage de texte?
Vous devez vous connecter pour publier un commentaire.
Est-il un moyen facile d'éviter de traiter avec des problèmes d'encodage de texte?
Vous devez vous connecter pour publier un commentaire.
On ne peut pas vraiment éviter de traiter avec le texte de problèmes de codage, mais il y a des solutions existantes:
Reader
àInputStream
:ReaderInputStream
Writer
àOutputStream
:WriterOutputStream
Vous suffit de sélectionner le codage de votre choix.
Si vous débuter avec une Chaîne, vous pouvez également effectuer les opérations suivantes:
ReaderInputStream
la mise en œuvre exige moins de mémoire -- il devrait y avoir aucun besoin pour stocker tous les octets dans un tableau à la fois.Bien, un Lecteur traite avec des personnages et un InputStream traite octets. Le codage précise la façon dont vous souhaitez représenter votre personnage en octets, de sorte que vous ne pouvez pas vraiment ignorer le problème. Pour éviter les problèmes, mon avis est: choisir un jeu de caractères (par exemple, "UTF-8") et rester avec elle.
Sur la façon de le faire, comme cela a été souligné, "l'évidence noms de ces classes sont ReaderInputStream et WriterOutputStream." Étonnamment, "elles ne sont pas incluses dans la bibliothèque Java" même si l' 'en face de' classes, InputStreamReader et OutputStreamWriter sont inclus.
Donc, beaucoup de gens sont venus avec leurs propres mises en œuvre, y compris Apache Commons IO. En fonction des questions de licences, vous serez probablement en mesure d'inclure les commons-io bibliothèque dans votre projet, ou même de copier une partie du code source (qui est téléchargeable ici).
Comme vous pouvez le voir, les deux classes de la documentation indique que "tous les charset encodages supportés par les JRE sont manipulés correctement".
N. B. Un commentaire sur l'une des autres réponses ici mentionne ce bug. Mais qui affecte l'Apache Ant ReaderInputStream classe (ici), pas Apache Commons IO ReaderInputStream classe.
Également noter que, si vous êtes de commencer par une Chaîne, vous pouvez passer à la création d'un StringReader et de créer un InputStream en une seule étape à l'aide de org.apache.commons.io.IOUtils de Commons IO comme suit:
Bien sûr, vous devez toujours penser à propos de l'encodage de texte, mais au moins, la conversion se passe en une seule étape.
new ByteArrayInputStream(report.toString().getBytes("utf-8"))
, ce qui implique l'attribution de deux exemplaires supplémentaires du rapport à la mémoire. Si le rapport est grand, il est mauvais. Voir ma réponse.Utilisation:
De cette façon, ne pas exiger une avance de conversion à
String
puis àbyte[]
, qui consacre beaucoup plus de mémoire dans la mémoire, dans le cas où le rapport est grand. Il convertit en octets, à la volée comme le flux est lu, droit de la StringBuffer.Il utilise CharSequenceInputStream de Apache Commons IO projet.
commons-io 2.0 a
WriterOutputStream
L'évidence noms de ces classes sont ReaderInputStream et WriterOutputStream. Malheureusement, elles ne sont pas incluses dans la bibliothèque Java. Toutefois, google est votre ami.
Je ne suis pas sûr qu'il va obtenir autour de tous les problèmes d'encodage de texte, qui sont cauchemardesque.
Il y a un RFE, mais il est Fermé, ne va pas s'arranger.
Vous ne pouvez pas éviter l'encodage de texte des questions, mais Apache commons-io a
Noter que ce sont les bibliothèques visés dans la réponse de Pierre de koders.com, juste des liens à la bibliothèque au lieu de code source.
Êtes-vous essayer d'écrire le contenu d'un
Reader
à unOutputStream
? Si oui, vous aurez un temps plus facile d'emballer laOutputStream
dans unOutputStreamWriter
et écrire lechar
s de laReader
à laWriter
, au lieu d'essayer de convertir le lecteur à unInputStream
:Un avertissement lors de l'utilisation de WriterOutputStream - il n'est pas toujours la poignée de l'écriture des données binaires dans un fichier correctement/le même régulièrement le flux de sortie. J'ai eu un problème avec ce qui m'a pris un certain temps à traquer.
Si vous le pouvez, je vous recommande d'utiliser un flux de sortie en tant que votre base, et si vous avez besoin d'écrire des chaînes de caractères, utilisez un OUtputStreamWriter wrapper autour de la flux de le faire. Il est beaucoup plus fiable pour convertir du texte en octets que l'inverse, ce qui est probablement pourquoi WriterOutputStream n'est pas une partie de la Java standard de la bibliothèque
Vous pouvez utiliser Cactoos (pas de méthodes statiques, seuls les objets):
nouveau InputStreamOf(lecteur)
nouveau OutputStreamTo(écrivain)
Vous pouvez convertir dans l'autre sens aussi:
nouveau ReaderOf(inputStream)
nouveau WriterTo(outputStream)
Pour Lire une chaîne de caractères dans un flux de données en utilisant simplement ce que java fournitures.