Java Language Stream vs Writer / Reader API


Ejemplo

Los flujos proporcionan el acceso más directo al contenido binario, por lo que cualquier implementación de InputStream / OutputStream siempre opera en int s y 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);
}

Hay algunas excepciones, probablemente la más notable, PrintStream que agrega la "capacidad de imprimir representaciones de varios valores de datos de manera conveniente". Esto permite utilizar System.out como InputStream binario y como salida textual utilizando métodos como System.out.println() .

Además, algunas implementaciones de flujo funcionan como una interfaz para contenidos de alto nivel, como objetos Java (consulte Serialización) o tipos nativos, por ejemplo, DataOutputStream / DataInputStream .

Con las clases Writer y Reader , Java también proporciona una API para flujos de caracteres explícitos. Aunque la mayoría de las aplicaciones basarán estas implementaciones en flujos, la API de flujo de caracteres no expone ningún método para contenido 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();

Siempre que sea necesario codificar caracteres en datos binarios (por ejemplo, al usar las clases InputStreamWriter / OutputStreamWriter ), debe especificar un conjunto de caracteres si no desea depender del conjunto de caracteres predeterminado de la plataforma. En caso de duda, utilice una codificación compatible con Unicode, por ejemplo, UTF-8 que sea compatible con todas las plataformas Java. Por lo tanto, probablemente debería alejarse de clases como FileWriter y FileReader ya que siempre usan el conjunto de caracteres predeterminado de la plataforma. Una mejor manera de acceder a los archivos utilizando secuencias de caracteres es esta:

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 de los Reader s más utilizados es BufferedReader que proporciona un método para leer líneas enteras de texto de otro lector y es probablemente la forma más sencilla de leer una línea de caracteres en línea de secuencia:

// 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);
}