J'ai plusieurs écouteurs de sortie qui implémentent OutputStream. Cela peut être soit une écriture PrintStream sur stdout ou dans un fichier, soit une écriture en mémoire ou toute autre destination de sortie; Par conséquent, j'ai spécifié OutputStream en tant qu'argument (un) dans la méthode.
Maintenant, j'ai reçu la chaîne. Quel est le meilleur moyen d'écrire dans les flux ici?
Devrais-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, il sera converti automatiquement?
Dois-je utiliser des flux de ponts ici?
Les flux (InputStream
et OutputStream
) transfèrent des 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) à l'aide de la méthode String.getBytes(Charset)
, mais évitez la méthode String.getBytes()
, car elle utilise le codage par défaut de la machine virtuelle, qui ne peut être prédite de manière fiable de manière portable.
Cependant, la manière habituelle d'écrire des données de caractères dans un flux consiste à envelopper le flux dans un Writer
, (souvent un PrintWriter
), qui effectue la conversion pour vous lorsque vous appelez sa méthode write(String)
(ou print(String)
). Le wrapper correspondant à InputStreams est un lecteur .
PrintStream
est une implémentation OutputStream
spéciale en ce sens qu'elle contient également des méthodes qui codent automatiquement les chaînes (elle utilise un rédacteur en interne). Mais c'est toujours un flux. Vous pouvez en toute sécurité encapsuler votre flux avec un rédacteur, peu importe qu'il s'agisse d'une implémentation de PrintStream
ou d'une autre. Il n'y a pas de 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();
}
OutputStream écrit des octets, String fournit des caractères. Vous devez définir Charset pour encoder une chaîne en octet []:
outputStream.write(string.getBytes(Charset.forName("UTF-8")));
Remplacez UTF-8
par un jeu de caractères de votre choix.
Vous pouvez créer un PrintStream qui entoure votre OutputStream, puis appelez-le print (String):
final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
à dessein cela doit être fait 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
Enveloppez votre OutputStream avec un PrintWriter et utilisez les méthodes d'impression de cette classe. Ils prennent une ficelle et font le travail pour vous.
Vous pouvez utiliser Apache Commons IO :
try (OutputStream outputStream = ...) {
IOUtils.write("data", outputStream, "UTF-8");
}