Penso che alle altre risposte manchi un punto/domanda importante.
si deve essere molto usare un OutputStream?
Le gerarchie di classi OutputStream
e InputStream
sono per la scrittura e la lettura di dati orientati ai byte. Ma le stringhe Java non sono orientate ai byte. Sono orientati ai caratteri (in prima approssimazione) e i caratteri in Java sono unità di codice Unicode a 16 bit.
Quando si scrivono i caratteri su un flusso di byte, la JVM deve eseguire una conversione in codificare i caratteri come byte. In effetti, ci sono molti modi possibili per farlo. Ad esempio, UTF-8 codificherà ciascun carattere nella sequenza come uno o più byte, Latin-1 o ASCII codificherà un sottoinsieme di caratteri come byte singoli e trasformerà gli altri in (probabilmente) punti interrogativi. E così via.
Ora, è possibile scrivere qualcosa del genere:
public void print(String s){
o.write(s.getBytes());
}
ma ha un problema.Il problema è che il metodo getBytes()
su un String
utilizza lo schema di codifica dei caratteri predefinito della JVM per eseguire la conversione. E questo (lo schema di codifica predefinito) dipende dall'ambiente in cui è stata lanciata la JVM. Quindi quel codice, fa cose diverse a seconda dell'ambiente. Ora si potrebbe rimediare specificando il charset:
public void print(String s){
o.write(s.getBytes("UTF-8"));
}
ma che diventa ingombrante se si sta chiamando getBytes in un sacco di posti.
Se si sta eseguendo un sacco di output basato su testo, un'idea migliore è utilizzare l'API Writer
anziché l'API OutputStream
. L'API Writer
e le sue implementazioni riguardano la conversione sotto il cofano ... e in modo più coerente ed efficiente.
Il punto finale è che ci sono altre API che possono essere utili nel fare l'output basato sul testo.
- L'uscita di sostegno efficiente
BufferedWriter
classe (e anche BufferedOutputStream
) introducendo buffer in memoria nel processo di uscita. Ciò consente di risparmiare chiamate di sistema, soprattutto se si eseguono molte piccole operazioni di scrittura.
- La classe
PrintWriter
fornisce un sacco di metodi di convenienza e rimuove anche la necessità di gestire IOExceptions. (In caso di IOException, il PrintWriter
fa una nota di esso. C'è un metodo per testare se si è verificata un'eccezione. Questo può essere utile o pericolose, a seconda di quello che stai facendo ...)
fonte
2012-06-04 03:15:51
Si dovrebbe 1) guarda l'API OutputStream e usa i metodi disponibili, e 2) se hai un errore, inserisci qui l'errore in modo da non dover indovinare cosa non va. –
Ad esempio, l'API mostrerà che non esiste un metodo OutputStream chiamato write (...) che accetta un parametro String, quindi non è possibile crearne uno e aspettarsi che funzioni. Invece è necessario utilizzare i metodi disponibili. –