Java Language
InputStreams y OutputStreams
Buscar..
Sintaxis
- int read (byte [] b) lanza IOException
Observaciones
Tenga en cuenta que la mayoría de las veces NO usa InputStream
s directamente, sino que usa BufferedStream
s, o similar. Esto se debe a que InputStream
lee desde la fuente cada vez que se llama al método de lectura. Esto puede causar un uso significativo de la CPU en contextos que entran y salen del kernel.
Leyendo InputStream en una cadena
A veces es posible que desee leer la entrada de bytes en una cadena. Para hacer esto, tendrá que encontrar algo que convierta entre byte
y los puntos de código UTF-16 "Java nativos" utilizados como caracteres char
. Eso se hace con un InputStreamReader
.
Para acelerar un poco el proceso, es "habitual" asignar un búfer, de modo que no tengamos demasiada sobrecarga al leer desde la entrada.
public String inputStreamToString(InputStream inputStream) throws Exception {
StringWriter writer = new StringWriter();
char[] buffer = new char[1024];
try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
int n;
while ((n = reader.read(buffer)) != -1) {
// all this code does is redirect the output of `reader` to `writer` in
// 1024 byte chunks
writer.write(buffer, 0, n);
}
}
return writer.toString();
}
Al transformar este ejemplo en Java SE 6 (y en una versión inferior), el código compatible se omite como un ejercicio para el lector.
Escritura de bytes en un OutputStream
Escribir bytes en un OutputStream
un byte a la vez
OutputStream stream = object.getOutputStream();
byte b = 0x00;
stream.write( b );
Escribiendo una matriz de bytes
byte[] bytes = new byte[] { 0x00, 0x00 };
stream.write( bytes );
Escribir una sección de una matriz de bytes
int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };
stream.write( bytes, offset, length );
Cierre de arroyos
La mayoría de las transmisiones deben cerrarse cuando haya terminado con ellas, de lo contrario podría introducir una pérdida de memoria o dejar un archivo abierto. Es importante que las transmisiones estén cerradas incluso si se lanza una excepción.
try(FileWriter fw = new FileWriter("outfilename");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//handle this however you
}
Recuerde: try-with-resources garantiza que los recursos se han cerrado cuando se sale del bloque, ya sea que ocurra con el flujo de control habitual o debido a una excepción.
A veces, intentar con recursos no es una opción, o quizás esté soportando una versión anterior de Java 6 o anterior. En este caso, el manejo adecuado es utilizar un finally
de bloque:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt");
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//handle this however you want
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//typically not much you can do here...
}
}
Tenga en cuenta que cerrar una secuencia de envoltura también cerrará su secuencia subyacente. Esto significa que no puede envolver una secuencia, cerrar la envoltura y luego continuar usando la secuencia original.
Copiar el flujo de entrada al flujo de salida
Esta función copia datos entre dos flujos:
void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8192];
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
}
Ejemplo -
// reading from System.in and writing to System.out
copy(System.in, System.out);
Envolviendo flujos de entrada / salida
OutputStream
y InputStream
tienen muchas clases diferentes, cada una de ellas con una funcionalidad única. Al envolver un flujo alrededor de otro, obtiene la funcionalidad de ambos flujos.
Puedes envolver un flujo cualquier cantidad de veces, solo toma nota del pedido.
Combinaciones utiles
Escribir caracteres en un archivo mientras se usa un búfer
File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));
Comprimir y cifrar datos antes de escribir en un archivo mientras se usa un búfer
Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));
Lista de envoltorios de flujo de entrada / salida
Envoltura | Descripción |
---|---|
BufferedOutputStream / BufferedInputStream | Mientras que OutputStream escribe datos de un byte a la vez, BufferedOutputStream escribe datos en fragmentos. Esto reduce el número de llamadas al sistema, mejorando así el rendimiento. |
DeflaterOutputStream / DeflaterInputStream | Realiza la compresión de datos. |
InflaterOutputStream / InflaterInputStream | Realiza descompresión de datos. |
CipherOutputStream / CipherInputStream | Cifra / descifra datos. |
DigestOutputStream / DigestInputStream | Genera Message Digest para verificar la integridad de los datos. |
CheckedOutputStream / CheckedInputStream | Genera un CheckSum. CheckSum es una versión más trivial de Message Digest. |
DataOutputStream / DataInputStream | Permite la escritura de tipos de datos primitivos y cadenas. Significado para escribir bytes. Plataforma independiente. |
PrintStream | Permite la escritura de tipos de datos primitivos y cadenas. Significado para escribir bytes. Dependiente de la plataforma. |
OutputStreamWriter | Convierte un OutputStream en un escritor. Un OutputStream trata con bytes mientras que Writers trata con caracteres |
PrintWriter | Llama automáticamente a OutputStreamWriter. Permite la escritura de tipos de datos primitivos y cadenas. Estrictamente para escribir personajes y mejor para escribir personajes. |
Ejemplo de DataInputStream
package com.streams;
import java.io.*;
public class DataStreamDemo {
public static void main(String[] args) throws IOException {
InputStream input = new FileInputStream("D:\\datastreamdemo.txt");
DataInputStream inst = new DataInputStream(input);
int count = input.available();
byte[] arr = new byte[count];
inst.read(arr);
for (byte byt : arr) {
char ki = (char) byt;
System.out.print(ki+"-");
}
}
}