Scrivi una stringa nel flusso di output


139

Ho diversi ascoltatori di output che stanno implementando OutputStream. Può essere un PrintStream che scrive su stdout o su un File oppure può scrivere in memoria o in qualsiasi altra destinazione di output; pertanto, ho specificato OutputStream come argomento (an) nel metodo.

Ora ho ricevuto la stringa. Qual è il modo migliore per scrivere su stream qui?

Dovrei solo usare Writer.write (message.getBytes ())? Posso assegnargli byte, ma se il flusso di destinazione è un flusso di caratteri, verrà convertito automaticamente?

Devo usare qui alcuni stream di bridge?


2
Non sono sicuro, ma sembra che tu stia provando a reinventare la ruota qui, hai guardato attraverso l'API Java Base e l'API Commons IO?
posdef

Risposte:


149

Stream ( InputStreame OutputStream) trasferire dati binari . Se vuoi scrivere una stringa in uno stream, devi prima convertirla in byte, o in altre parole codificarla . Puoi farlo manualmente (come suggerisci) usando il String.getBytes(Charset)metodo, ma dovresti evitare il String.getBytes()metodo, perché utilizza la codifica predefinita della JVM, che non può essere prevista in modo affidabile in modo portatile.

Il solito modo di scrivere i dati dei personaggi in uno stream, tuttavia, è avvolgere lo stream in un Writer(, spesso a PrintWriter), che esegue la conversione per te quando chiami il suo write(String)(o print(String)) metodo. Il wrapper corrispondente per InputStreams è un Reader .

PrintStreamè OutputStreamun'implementazione speciale nel senso che contiene anche metodi che codificano automaticamente le stringhe (usa internamente uno scrittore). Ma è ancora un flusso. Puoi avvolgere il tuo stream in modo sicuro con uno scrittore, indipendentemente dal fatto che si tratti di PrintStreamun'implementazione di qualche altro flusso. Non c'è pericolo di doppia codifica.

Esempio di PrintWriter con OutputStream:

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

3
Quindi usare PrintWriterè come usare String.getBytes(). Utilizza qualsiasi codifica casuale che risulta essere il valore predefinito di JVM. Quindi funziona solo se sei fortunato.
Christoffer Hammarström,

106

OutputStream scrive byte, String fornisce caratteri. È necessario definire Charset per codificare la stringa in byte []:

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

Passare UTF-8a un set di caratteri a scelta.


3
Aggiungi con la seguente riga. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel,

32

Puoi creare un PrintStream che avvolge il tuo OutputStream e chiamarlo semplicemente print (String):

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

2
Quale set di caratteri utilizza PrintStream per convertire in byte?
Dean Hiller,

20

In base alla progettazione , deve essere fatto in questo modo:

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

3
Si noti che w.close()chiuderà outanche.
Franklin Yu,

12

Avvolgere OutputStream con un PrintWriter e utilizzare i metodi di stampa su quella classe. Prendono una stringa e fanno il lavoro per te.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.