J'ai plusieurs écouteurs de sortie qui implémentent OutputStream. Il peut s'agir d'une écriture PrintStream sur stdout ou dans un fichier, ou d'écrire dans la mémoire ou toute autre destination de sortie; par conséquent, j'ai spécifié OutputStream comme argument (un) dans la méthode.
Maintenant, j'ai reçu le String. Quelle est la meilleure façon d'écrire sur des flux ici?
Dois-je simplement utiliser Writer.write (message.getBytes ())? Je peux lui donner des octets, mais si le flux de destination est un flux de caractères, sera-t-il converti automatiquement?
Dois-je utiliser des flux de pont ici à la place?
Réponses:
Les flux (
InputStream
etOutputStream
) transfèrent des données binaires . Si vous souhaitez écrire une chaîne dans un flux, vous devez d'abord la convertir en octets, ou en d'autres termes l' encoder . Vous pouvez le faire manuellement (comme vous le suggérez) en utilisant laString.getBytes(Charset)
méthode, mais vous devriez éviter laString.getBytes()
méthode, car elle utilise le codage par défaut de la JVM, qui ne peut pas être prédit de manière fiable de manière portable.La façon habituelle d'écrire des données de caractères dans un flux, cependant, consiste à envelopper le flux dans un
Writer
, (souvent aPrintWriter
), qui effectue la conversion pour vous lorsque vous appelez sawrite(String)
(ouprint(String)
) méthode. Le wrapper correspondant pour InputStreams est un Reader .PrintStream
est uneOutputStream
implémentation spéciale dans le sens où elle contient également des méthodes qui encodent automatiquement des chaînes (elle utilise un écrivain en interne). Mais c'est toujours un courant. Vous pouvez encapsuler votre flux en toute sécurité avec un écrivain, qu'il s'agisse d'unePrintStream
ou d'une autre implémentation de flux. Il n'y a aucun risque de double encodage.Exemple de PrintWriter avec OutputStream:
la source
PrintWriter
c'est comme utiliserString.getBytes()
. Il utilise tout encodage aléatoire qui se trouve être la valeur par défaut de la JVM. Donc cela ne fonctionne que si vous avez de la chance.OutputStream écrit des octets, String fournit des caractères. Vous devez définir Charset pour encoder la chaîne en octet []:
Changez
UTF-8
pour un jeu de caractères de votre choix.la source
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Vous pouvez créer un enveloppement PrintStream autour de votre OutputStream, puis l'appeler simplement print (String):
la source
De par sa conception, cela doit être fait de cette façon:
la source
w.close()
se fermeraout
également.Enveloppez votre OutputStream avec un PrintWriter et utilisez les méthodes d'impression sur cette classe. Ils prennent une chaîne et font le travail pour vous.
la source
Vous pouvez utiliser Apache Commons IO :
la source
IOUtils.write(String data, OutputStream output, Charset encoding)
est implémenté commeoutput.write(data.getBytes(Charsets.toCharset(encoding)))
, donc il peut si une chaîne codée ne peut pas tenir dans un tableau d'octets