2017-07-26 4 views
-1

Ich bin neu auf I/O in Java, und in einem der Beiträge auf dieser Seite gelesen, dass:Java I/O-Stream Definition und Subtypen

alle Ströme in der gleichen Weise verhalten, auch wenn Die tatsächlichen physischen Geräte, mit denen sie verbunden sind, unterscheiden sich. Somit können die gleichen E/A-Klassen und Methoden, um jede Art von Gerät

von Zitiert angewendet werden: Stream definition

Was ich nicht meinen Kopf wickeln kann um ist, wie es ist, dass alle Ströme (nehmen die verschiedenen Byte-Stream-Subtypen zum Beispiel - BufferedInputStream, Filterinput, Object, .. usw.) auf die gleiche Weise verhalten und können auf jede beliebige physikalische Gerät angeschlossen werden, wenn sie als unterschiedliche Klassen angeblich Angebot umgesetzt werden unterschiedliche Funktionalität und unterschiedliche Quellen/Ziele? Zum Beispiel kann ich ObjectInputStream oder FileOutputStream verwenden, um von der Konsole zu lesen und zu schreiben? Verschiedene Ströme, verschiedene Geräte und alle (Streams) können an alle (Geräte) angeschlossen werden - ich bin ratlos hier ..

Antwort

3

Das Zitat sagt nicht, dass Sie jeder Stream jede Gerät anschließen können wie du sagst. Es gibt verschiedene Implementierungen von InputStream und OutputStream, die mit bestimmten Geräten verbunden sind - zum Beispiel FileInputStream verbindet sich mit einer Datei im Dateisystem und ByteArrayInputStream verbindet sich mit einem Byte-Array im Speicher.

Die Grundidee, dass das Zitat erklärt, ist, dass alle diese verschiedenen Arten von Streams alle Erweiterungen der Klassen InputStream und OutputStream sind, so dass Sie alle gängigen Operationen auf Streams mit einer der spezifischen Arten von Streams tun können, unabhängig davon, wo die bestimmte Art von Stream Daten liest oder schreibt.

Einige Streams sind Wrapper um andere Streams und fügen spezifische Funktionen hinzu. Beispielsweise fügt BufferedOutputStream die Pufferung zu einem zugrunde liegenden Stream hinzu. Dies ist oft nützlich, da für einige Streams das Schreiben in Blöcken effizienter ist als das byteweise Schreiben - BufferedOutputStream sammelt Bytes, die Sie in einen Puffer schreiben, der dann in den zugrunde liegenden Stream als ein Block geschrieben wird. ObjectOutputStream ist ein weiterer Wrapper, der die Funktionalität hinzufügt, serialisierbare Java-Objekte in Bytes zu konvertieren, die in einen zugrunde liegenden Stream geschrieben werden können.

+0

Aber es sagt "die gleichen I/O-Klassen und Methoden können auf jede Art von Gerät angewendet werden", die sich auf die konkreten Klassen bezieht. Die in InputStream und OutputStream etablierte gemeinsame Kernfunktionalität kann Kontext zum Verständnis des ersten Teils der Aussage über alle sich ähnlich verhaltenden Streams liefern - Ihr Punkt über die Bereitstellung allgemeiner Funktionalität durch die verschiedenen Implementierungen, aber der Teil über dieselben Klassen und Methoden, die mit verschiedenen Geräten verknüpft sind ist in seiner Interpretation auf die Bedeutung verschiedener konkreter Klassen (Ströme) beschränkt – Surfer

+0

Die einzige Möglichkeit, die Aussage für mich sinnvoll wäre, wenn durch "Alle Ströme" in "Alle Ströme auf die gleiche Weise verhalten", bedeutet alle Ströme einzeln genommen, nicht relativ zueinander, so dass sich ein bestimmter Stream-Typ auf die gleiche Weise verhält, selbst wenn er mit verschiedenen Geräten verbunden war - das heißt, unabhängig vom Verwendungsszenario verhält sich ein Stream immer noch gleich, da die Schnittstelle (Klassenmethoden) die ist Gleiches und abstrahiert die unterschiedlichen Hardware-Besonderheiten. Das gilt für alle Streams. – Surfer

+0

Das Problem mit dieser Interpretation ist, dass Sprache Leute nicht viel Zustimmung geben (obwohl es immer noch nicht vollständig ausschließen). – Surfer

1

Sie können nicht jeden Stream für jedes Gerät verwenden. in Ihrer Frage (fett von mir) die Definition nach,

Alle Ströme verhalten auf die gleiche Weise.

So können Sie jeden Strom gleich, benutzen, die jedes Stream bedeutet, hat die gleichen Methoden, da sie von java.io.OutputStream oder java.io.InputStream erben.

So ist es egal, ob Sie auf die Konsole oder eine Datei oder ein Netzwerk-Socket schreiben möchten, können Sie z. Schreiben Sie immer ein Byte-Array in das Gerät.

Nichtsdestotrotz gibt es verschiedene Implementierungen, die das Schreiben dieses Byte-Arrays anders handhaben.