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.

Java SE 7
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.

Java SE 7
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.

Java SE 6

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+"-");  
    }  
  }  
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow