Ricerca…


Sintassi

  • int read (byte [] b) genera IOException

Osservazioni

Nota che il più delle volte NON usi direttamente InputStream ma usi BufferedStream s, o simili. Questo perché InputStream legge dall'origine ogni volta che viene chiamato il metodo di lettura. Ciò può causare un utilizzo significativo della CPU in switch di contesto all'interno e all'esterno del kernel.

Lettura di InputStream in una stringa

A volte potresti voler leggere l'input da byte in una stringa. Per fare ciò è necessario trovare qualcosa che converta tra byte e i "Codepoint" UTF-16 "nativi Java" utilizzati come char . Questo è fatto con un InputStreamReader .

Per accelerare un po 'il processo, è "normale" allocare un buffer, in modo da non avere un sovraccarico eccessivo durante la lettura da Input.

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

Trasformare questo esempio in codice Java 6 (e inferiore) -compatibile è lasciato fuori come esercizio per il lettore.

Scrittura di byte su un OutputStream

Scrittura di byte su un OutputStream un byte alla volta

OutputStream stream = object.getOutputStream();

byte b = 0x00;
stream.write( b );

Scrivere un array di byte

byte[] bytes = new byte[] { 0x00, 0x00 };

stream.write( bytes );

Scrivere una sezione di un array di byte

int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };

stream.write( bytes, offset, length );

Flussi di chiusura

La maggior parte dei flussi deve essere chiusa quando hai finito con loro, altrimenti potresti introdurre una perdita di memoria o lasciare un file aperto. È importante che gli stream siano chiusi anche se viene lanciata un'eccezione.

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 
}

Ricorda: try-with-resources garantisce che le risorse siano state chiuse quando il blocco è stato interrotto, sia che ciò avvenga con il normale flusso di controllo o a causa di un'eccezione.

Java SE 6

A volte, try-with-resources non è un'opzione, o forse stai supportando la versione precedente di Java 6 o precedente. In questo caso, la corretta movimentazione è di usare un finally blocco:

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...
    }
}

Nota che chiudere un flusso wrapper chiuderà anche il suo stream sottostante. Ciò significa che non puoi eseguire il wrapping di un flusso, chiudere il wrapper e continuare a utilizzare il flusso originale.

Copia del flusso di input sul flusso di uscita

Questa funzione copia i dati tra due flussi:

void copy(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[8192];
    while ((bytesRead = in.read(buffer)) > 0) {
        out.write(buffer, 0, bytesRead);
    }
}

Esempio -

 // reading from System.in and writing to System.out
copy(System.in, System.out);

Racchiudere flussi di input / output

OutputStream e InputStream hanno molte classi diverse, ognuna con una funzionalità unica. Con il wrapping di un flusso attorno ad un altro, si ottiene la funzionalità di entrambi i flussi.

Puoi avvolgere un flusso qualsiasi numero di volte, prendi nota dell'ordine.

Combinazioni utili

Scrivere caratteri su un file mentre si utilizza un buffer

File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));

Comprimere e crittografare i dati prima di scrivere su un file mentre si utilizza un buffer

Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));

Elenco di wrapper di flusso input / output

involucro Descrizione
BufferedOutputStream / BufferedInputStream Mentre OutputStream scrive i dati un byte alla volta, BufferedOutputStream scrive i dati in blocchi. Questo riduce il numero di chiamate di sistema, migliorando così le prestazioni.
DeflaterOutputStream / DeflaterInputStream Esegue la compressione dei dati.
InflaterOutputStream / InflaterInputStream Esegue la decompressione dei dati.
CipherOutputStream / CipherInputStream Crittografa / decrittografa i dati.
DigestOutputStream / DigestInputStream Genera Message Digest per verificare l'integrità dei dati.
CheckedOutputStream / CheckedInputStream Genera un Somma di controllo. CheckSum è una versione più banale di Message Digest.
DataOutputStream / DataInputStream Consente la scrittura di tipi di dati e stringhe primitivi. Significa per scrivere byte. Piattaforma indipendente.
PrintStream Consente la scrittura di tipi di dati e stringhe primitivi. Significa per scrivere byte. Piattaforma dipendente
OutputStreamWriter Converte un OutputStream in un writer. Un OutputStream tratta i byte mentre i writer si occupano di caratteri
PrintWriter Chiama automaticamente OutputStreamWriter. Consente la scrittura di tipi di dati e stringhe primitivi. Rigorosamente per scrivere caratteri e meglio per scrivere personaggi

Esempio di 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow