Java Language
InputStreams e OutputStreams
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.
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.
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.
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+"-");
}
}
}