Unterschied InputStream vs. Outputstream

Einfach gesagt wird ein InputStream verwendet um von einer Quelle zu lesen, ein OutputStream um in ein Ziel zu schreiben.

Inhaltsverzeichnis

Der Unterschied

Das Ziel der Streams ist ein Interface anzubieten, um Daten zu lesen bzw. zu schreiben, unabhängig davon ob die Quelle oder das Ziel nun eine Datei, die Konsole, ein HTTP-Request oder ein entfernter Rechner ist. Gleich bleibt:

  • Aus einem InputStream wird gelesen.
  • In einen OutputStream wird geschrieben.

Das In bzw. Out wird also aus Sicht des Programmes gesehen: Input in das Programm, Output aus dem Programm.

InputStream Beispiel

Vorneweg: es gibt bessere Methoden, eine Textdatei einzulesen. Dieses Beispiel soll nur die Funktionsweise der Klasse InputStream veranschaulichen:

public static String readFromInputStream(String fileName) throws IOException {
    try(InputStream is = new FileInputStream(fileName)) {
        byte[] buffer = new byte[1024];
        StringBuilder stringBuilder = new StringBuilder();

        int bytesRead = is.read(buffer);
        while (bytesRead > 0) {
            stringBuilder.append(new String(Arrays.copyOfRange(buffer, 0, bytesRead), "UTF-8"));
            bytesRead = is.read(buffer);
        }
        return stringBuilder.toString();
    }
}

Da eine Datei eingelesen wird, wird die Klasse FileInputStream verwendet. Das Einlesen funktioniert folgendermaßen:

  • Die Methode read(byte[] buffer) nimmt ein byte-Array engegen und schreibt die Bytes des Streams so lange in das Array, bis entweder das Array voll ist, oder keine Bytes mehr gelesen werden können.
  • Der Rückgabewert bytesRead gibt die Anzahl der gelesenen Bytes zurück.
  • Das byte-Array wird nun weiterverwendet (in dem Fall in einen String umgewandelt), allerding nur so viel wie in den buffer eingelesen wurde.
  • Wenn keine Bytes mehr eingelesen werden, muss der Stream geschlossen werden. In diesem Fall sparen wir uns das Schließen, weil die try with resources Syntax verwendet wird, die seit Java 7 Teil von Java ist. Der InputStream wird in den runden Klammern des try-Statements instanziiert, wodurch der Stream automatisch am Ende des Blocks geschlossen wird.

Ähnliche Artikel