Java Language Stream vs Writer / Reader API


Esempio

Gli stream forniscono l'accesso più diretto al contenuto binario, quindi qualsiasi implementazione InputStream / OutputStream funziona sempre su int s e byte s.

// Read a single byte from the stream
int b = inputStream.read();
if (b >= 0) { // A negative value represents the end of the stream, normal values are in the range 0 - 255
    // Write the byte to another stream
    outputStream.write(b);
}

// Read a chunk
byte[] data = new byte[1024];
int nBytesRead = inputStream.read(data);
if (nBytesRead >= 0) { // A negative value represents end of stream
    // Write the chunk to another stream
    outputStream.write(data, 0, nBytesRead);
}

Ci sono alcune eccezioni, probabilmente in particolare PrintStream che aggiunge la "capacità di stampare le rappresentazioni di vari valori di dati convenientemente". Ciò consente di utilizzare System.out sia come InputStream binario sia come output testuale utilizzando metodi come System.out.println() .

Inoltre, alcune implementazioni di stream funzionano come interfaccia per contenuti di livello superiore come oggetti Java (vedi Serializzazione) o tipi nativi, ad esempio DataOutputStream / DataInputStream .

Con le classi Writer e Reader , Java fornisce anche un'API per i flussi di caratteri espliciti. Sebbene la maggior parte delle applicazioni baserà queste implementazioni sui flussi, l'API del flusso di caratteri non espone alcun metodo per il contenuto binario.

// This example uses the platform's default charset, see below
// for a better implementation.

Writer writer = new OutputStreamWriter(System.out);
writer.write("Hello world!");

Reader reader = new InputStreamReader(System.in);
char singleCharacter = reader.read();

Ogni volta che è necessario codificare i caratteri in dati binari (ad esempio quando si utilizzano le classi InputStreamWriter / OutputStreamWriter ), è necessario specificare un set di caratteri se non si desidera dipendere dal set di caratteri predefinito della piattaforma. In caso di dubbi, utilizzare una codifica compatibile con Unicode, ad esempio UTF-8, supportata su tutte le piattaforme Java. Pertanto, si dovrebbe probabilmente stare lontano da classi come FileWriter e FileReader poiché utilizzano sempre il set di caratteri della piattaforma predefinito. Un modo migliore per accedere ai file utilizzando i flussi di caratteri è questo:

Charset myCharset = StandardCharsets.UTF_8;

Writer writer = new OutputStreamWriter( new FileOutputStream("test.txt"), myCharset );
writer.write('Ä');
writer.flush();
writer.close();

Reader reader = new InputStreamReader( new FileInputStream("test.txt"), myCharset );
char someUnicodeCharacter = reader.read();
reader.close();

Uno dei Reader più comunemente usati è BufferedReader che fornisce un metodo per leggere intere righe di testo da un altro lettore ed è presumibilmente il modo più semplice per leggere un flusso di caratteri riga per riga:

// Read from baseReader, one line at a time
BufferedReader reader = new BufferedReader( baseReader );
String line;
while((line = reader.readLine()) != null) {
  // Remember: System.out is a stream, not a writer!
  System.out.println(line);
}