Suche…


Syntax

  • int read (byte [] b) löst IOException aus

Bemerkungen

Beachten Sie, dass Sie InputStream meistens NICHT direkt, sondern BufferedStream oder ähnliches verwenden. Dies liegt daran, dass InputStream bei jedem Aufruf der InputStream aus der Quelle liest. Dies kann zu erheblicher CPU-Auslastung bei Kontextwechseln in den Kernel und aus diesem heraus führen.

InputStream in einen String einlesen

Manchmal möchten Sie die Byte-Eingabe in einen String einlesen. Dazu müssen Sie etwas finden, das zwischen byte und den als char verwendeten UTF-16-Codepunkten "native Java" konvertiert. InputStreamReader geschieht mit einem InputStreamReader .

Um den Vorgang etwas zu beschleunigen, ist es "üblich", einen Puffer zuzuweisen, damit beim Lesen von Input nicht zu viel Aufwand entsteht.

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

Die Umwandlung dieses Beispiels in Java SE 6 (und niedriger) kompatiblen Code wird für den Leser als Übung ausgelassen.

Schreiben von Bytes in einen OutputStream

Schreiben von Bytes in einen OutputStream zu einem Zeitpunkt

OutputStream stream = object.getOutputStream();

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

Schreiben eines Byte-Arrays

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

stream.write( bytes );

Einen Abschnitt eines Byte-Arrays schreiben

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

stream.write( bytes, offset, length );

Streams schließen

Die meisten Streams müssen geschlossen werden, wenn Sie damit fertig sind. Andernfalls können Sie einen Speicherverlust verursachen oder eine Datei geöffnet lassen. Es ist wichtig, dass Streams auch dann geschlossen werden, wenn eine Ausnahme ausgelöst wird.

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 
}

Denken Sie daran: Try-with-Resources garantiert, dass die Ressourcen beim Beenden der Blockierung geschlossen wurden, unabhängig davon, ob dies mit dem üblichen Kontrollfluss oder aufgrund einer Ausnahme geschieht.

Java SE 6

Try-with-resources ist manchmal keine Option, oder Sie unterstützen ältere Versionen von Java 6 oder früher. In diesem Fall ist eine ordnungsgemäße Handhabung die Verwendung eines finally Blocks:

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

Beachten Sie, dass beim Schließen eines Wrapper-Streams auch der zugrunde liegende Stream geschlossen wird. Dies bedeutet, dass Sie einen Stream nicht umbrechen können, den Wrapper schließen und dann den ursprünglichen Stream weiterhin verwenden können.

Eingabestrom in Ausgabestrom kopieren

Diese Funktion kopiert Daten zwischen zwei Streams -

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

Beispiel -

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

Eingabe / Ausgabe-Streams umschließen

OutputStream und InputStream haben viele verschiedene Klassen, jede mit einer einzigartigen Funktionalität. Wenn Sie einen Stream um einen anderen wickeln, erhalten Sie die Funktionalität beider Streams.

Sie können einen Stream beliebig oft bündeln. Notieren Sie sich einfach die Bestellung.

Nützliche Kombinationen

Zeichen in eine Datei schreiben, während ein Puffer verwendet wird

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

Daten vor dem Schreiben in eine Datei komprimieren und verschlüsseln, während ein Puffer verwendet wird

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

Liste der Input / Output Stream-Wrapper

Verpackung Beschreibung
BufferedOutputStream / BufferedInputStream Während OutputStream ein Byte zu einem Zeitpunkt schreibt, BufferedOutputStream schreibt Daten in Stücke schneiden. Dies reduziert die Anzahl der Systemaufrufe und verbessert so die Leistung.
DeflaterOutputStream / DeflaterInputStream Führt eine Datenkomprimierung durch.
InflaterOutputStream / InflaterInputStream Führt die Dekomprimierung von Daten durch.
CipherOutputStream / CipherInputStream Verschlüsselt / entschlüsselt Daten.
DigestOutputStream / DigestInputStream Erzeugt Message Digest, um die Datenintegrität zu überprüfen.
CheckedOutputStream / CheckedInputStream Erzeugt eine CheckSum. CheckSum ist eine trivialere Version von Message Digest.
DataOutputStream / DataInputStream Ermöglicht das Schreiben von primitiven Datentypen und Strings. Bezeichnet das Schreiben von Bytes. Plattformunabhängig.
PrintStream Ermöglicht das Schreiben von primitiven Datentypen und Strings. Bezeichnet das Schreiben von Bytes. Plattformabhängig
OutputStreamWriter Konvertiert einen OutputStream in einen Writer. Ein OutputStream behandelt Bytes, während Writers sich mit Zeichen befassen
PrintWriter Ruft automatisch OutputStreamWriter auf. Ermöglicht das Schreiben von primitiven Datentypen und Strings. Nur für das Schreiben von Zeichen und am besten für das Schreiben von Zeichen

DataInputStream-Beispiel

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow