2010-11-01 10 views
96

J'ai plusieurs auditeurs de sortie qui implémentent OutputStream. Il peut s'agir d'une écriture PrintStream vers stdout ou vers un fichier, ou de l'écriture dans la mémoire ou toute autre destination de sortie; par conséquent, j'ai spécifié OutputStream comme argument (an) dans la méthode.chaîne en écriture à flux de sortie

Maintenant, j'ai reçu la chaîne. Quelle est la meilleure façon d'écrire sur les streams 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, puis-il convertir automatiquement?

Ai-je besoin d'utiliser des flux de pont ici à la place?

+1

Je ne suis pas sûr, mais cela sonne comme vous êtes essayer de réinventer la roue ici, avez-vous regardé à travers le J ava Base API, ainsi que Commons IO API? – posdef

Répondre

118

Streams (InputStream et OutputStream) transfert données binaires. Si vous voulez é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 la méthode String.getBytes(Charset), mais vous devriez éviter la méthode String.getBytes(), car qui utilise le codage par défaut de la machine virtuelle Java, qui ne peut être prédite avec certitude d'une manière portable.

La manière habituelle d'écrire des données de caractère à un flux, cependant, est d'envelopper le flux dans un Writer, (souvent un PrintWriter), qui fait la conversion pour vous lorsque vous appelez sa méthode write(String) (ou print(String)). L'encapsuleur correspondant pour InputStreams est un Reader.

PrintStream est une implémentation spéciale OutputStream dans le sens où elle contient également des méthodes qui codent automatiquement les chaînes (elle utilise un écrivain en interne). Mais c'est toujours un flux. Vous pouvez envelopper votre flux en toute sécurité avec un écrivain, peu importe s'il s'agit d'un PrintStream ou d'une autre implémentation de flux. Il n'y a aucun risque de double encodage.

Exemple de PrintWriter avec OutputStream:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) { 
    p.println("Hello"); 
} catch (FileNotFoundException e1) { 
    e1.printStackTrace(); 
} 
11

Enveloppez votre OutputStream avec un PrintWriter et utiliser les méthodes d'impression sur cette classe. Ils prennent une corde et font le travail pour vous.

29

Vous pouvez créer un emballage PrintStream autour de votre OutputStream puis appelez juste Imprimons (String):

final OutputStream os = new FileOutputStream("/tmp/out"); 
final PrintStream printStream = new PrintStream(os); 
printStream.print("String"); 
printStream.close(); 
+2

Quel jeu de caractères PrintStream utilise-t-il pour convertir en octets? –

73

OutputStream octets écrit, String fournit des caractères. Vous devez définir Charset pour encoder chaîne à octet []:

outputStream.write(string.getBytes(Charset.forName("UTF-8"))); 

changement UTF-8 à un jeu de caractères de votre choix.

+0

Ajouter avec la ligne suivante. 'ByteArrayOutputStream outputStream = new ByteArrayOutputStream();' –

11

By design il est à faire de cette façon:

OutputStream out = ...; 
try (Writer w = new OutputStreamWriter(out, "UTF-8")) { 
    w.write("Hello, World!"); 
} // or w.close(); //close will auto-flush 
+1

Notez que 'w.close()' fermera 'out' également. –