Java InputStream-Klasse

InputStream ist eine abstrakte Basisklasse im Java-I/O-System zum Lesen von Byte-Daten, die sich befindet injava.iodem Paket.

InputStream ist die Elternklasse aller Byte-Eingabestreams und stellt ein grundlegendes Framework zum Lesen von Byte-Daten bereit.

InputStream ist eine abstrakte Klasse, was bedeutet, dass Sie sie nicht direkt instanziieren können, aber Sie können konkrete Eingabestream-Objekte über ihre Unterklassen erstellen (wie FileInputStream, ByteArrayInputStream usw.).


Kernmethodenanalyse

InputStream ist Teil der Java-IO-Streams und wird zum Lesen von Daten in Bytes (8-Bit) verwendet.

InputStream eignet sich zur Verarbeitung von Nicht-Text-Daten, wie Bildern, Audio, Video, komprimierten Dateien usw.

Sie können es sich als ein "Wasserrohr" vorstellen, bei dem Daten wie Wasser von der Quelle zu Ihrem Programm fließen.

Kernmethoden

MethodennameBeschreibung
int read()Liest ein Byte, der Rückgabewert ist ein int von 0 bis 255, gibt zurück, wenn das Ende des Streams erreicht ist-1
int read(byte[] b)Liest höchstens aus dem Streamb.lengthBytes an Daten und speichert sie in einem Byte-Arrayb
int read(byte[] b, int off, int len)fromoffLiest höchstens ab der Offset-PositionlenBytes in das Arrayb
void close()Schließt den Stream und gibt zugehörige Ressourcen frei

Ein einzelnes Byte lesen

public abstract int read() throws IOException

Dies ist die grundlegendste Methode in InputStream, mit der das nächste Datenbyte aus dem Eingabestream gelesen wird. Der Rückgabewert ist ein int zwischen 0 und 255, und -1 wird zurückgegeben, wenn das Ende des Streams erreicht ist.

Beispielcode

Beispiel

InputStream input = new FileInputStream("example.txt");
int data = input.read();
while(data != -1) {
    System.out.print((char)data);
    data = input.read();
}
input.close();

Byte-Array lesen

Beispiel

public int read(byte[] b) throws IOException

Diese Methode versucht, bis zu b.length Bytes an Daten in ein Byte-Array zu lesen, und gibt die tatsächliche Anzahl der gelesenen Bytes zurück oder -1, wenn das Ende des Streams erreicht ist.

Beispielcode

Beispiel

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
    System.out.println("Read " + bytesRead + " bytes");
}
input.close();

, bis zu 500 Bytes lesen

Beispiel

public int read(byte[] b, int off, int len) throws IOException

Mit dieser Methode können Sie die Position (off) angeben, an der die gelesenen Daten gespeichert werden sollen, und die maximale Anzahl der zu lesenden Bytes (len).

Beispielcode

Beispiel

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // Speichern beginnend bei buffer
input.close();

Bytes überspringen

Beispiel

public long skip(long n) throws IOException

Überspringt und verwirft n Bytes an Daten im Eingabestream und gibt die tatsächliche Anzahl der übersprungenen Bytes zurück.

Verfügbare Bytes prüfen

Beispiel

public int available() throws IOException

Gibt eine Schätzung der Anzahl an Bytes zurück, die aus diesem Eingabestream gelesen (oder übersprungen) werden können, ohne zu blockieren.

2.6 Stream schließen

Beispiel

public void close() throws IOException

Schließt den Eingabestream und gibt alle damit verbundenen Systemressourcen frei. Dies ist eine sehr wichtige Methode und sollte nach Abschluss der Stream-Operationen aufgerufen werden.


Einführung in gängige Unterklassen

  • FileInputStream: Wird verwendet, um Daten aus Dateien zu lesen.
  • ByteArrayInputStream: Ermöglicht die Verwendung eines Byte-Arrays im Speicher als Eingabestream.
  • FilterInputStream: Eine Dekorator-Klasse, die anderen Eingabestreams zusätzliche Funktionalität bietet.
  • ObjectInputStream: Wird verwendet, um Objekte zu deserialisieren, die zuvor mit ObjectOutputStream serialisiert wurden.
  • PipedInputStream: Wird zusammen mit PipedOutputStream verwendet, um eine Pipe-Kommunikation zwischen Threads zu implementieren.

Best Practices

try-with-resources verwenden

Java 7 führte die try-with-resources-Anweisung ein, die Ressourcen, die die AutoCloseable-Schnittstelle implementieren, automatisch schließen kann.

Beispiel

try (InputStream input = new FileInputStream("example.txt")) {
    int data;
    while ((data = input.read()) != -1) {
        System.out.print((char)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Gepuffertes Lesen für bessere Leistung

Bei großen Dateien oder häufigen Lesevorgängen wird empfohlen, mit BufferedInputStream zu umschließen, um die Leistung zu verbessern.

Beispiel

try (InputStream input = new BufferedInputStream(new FileInputStream("largefile.dat"))) {
    // Lesevorgang
} catch (IOException e) {
    e.printStackTrace();
}

Ausnahmen ordnungsgemäß behandeln

IO-Operationen können IOException auslösen, und diese Ausnahmen sollten ordnungsgemäß behandelt werden.


5. FAQ

Warum gibt die Methode read() int statt byte zurück?

Weil ein spezieller Wert (-1) benötigt wird, um das Ende des Streams anzuzeigen, und der Typ byte -1 nicht darstellen kann.

Wie konvertiert man InputStream in String?

Beispiel

public static String convertToString(InputStream input) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    }
}

Wie kopiert man InputStream?

InputStream kann normalerweise nur einmal gelesen werden. Wenn mehrere Lesevorgänge erforderlich sind, können Sie seinen Inhalt in ein Byte-Array oder ByteArrayInputStream kopieren.


6. Zusammenfassung

Die Klasse InputStream ist eine der Kernkomponenten des Java-I/O-Systems und bietet grundlegende Funktionen zum Lesen von Byte-Daten. Das Verständnis von InputStream und seinen Unterklassen ist entscheidend für den Umgang mit verschiedenen Eingabequellen (wie Dateien, Netzwerkverbindungen, Speicherpuffern usw.). In praktischen Anwendungen sollte auf Ressourcenverwaltung, Ausnahmebehandlung und Leistungsoptimierung geachtet werden.

Andere Erweiterungen