Streams sind ein abstraktes Konzept von Byte -Sequenzen.
Dateien sind statische Speicherformulare von Daten, während Streams auf das Formular verweisen, wenn Daten übertragen werden.
Stream -Klassen sind in zwei Hauptkategorien unterteilt: Knoten -Stream -Klassen und gefilterte Stream -Klassen (auch als Prozessstromklassen bezeichnet).
Die dem Zielgerät entsprechende Klasse wird als Knotenflussklasse bezeichnet. Das Programm kann auch die Knotenflussklasse über eine indirekte Flussklasse aufrufen, um eine flexiblere und bequemere Lektüre verschiedener Datenarten zu erreichen. Diese indirekte Strömungsklasse ist die Filterflussklasse (auch als Verarbeitungsflussklasse bezeichnet) oder die Verpackungsklasse.
Der Anrufprozess der Wrapper -Klasse lautet wie folgt:
Die Beziehung zwischen der Flussklassifizierung
Egal wie reich und komplex die Klassifizierung von Streams ist, ihre Wurzeln stammen aus vier Grundklassen. Die Beziehung zwischen diesen vier Klassen ist wie folgt:
| Byte -Stream | Charakterstrom | |
| Eingabestream | InputStream | Leser |
| Ausgangsstrom | Ausgangsstream | Schriftsteller |
Unicode codiert gespeicherte Zeichen in Java, und die Charakterstromverarbeitungsklasse ist für die Konvertierung anderer externer codierter Zeichenströme und Unicode -Zeichenströme in Java verantwortlich. Die Klassen InputStreamReader und OutputStreamWriter verwandeln Konvertierungen von Zeichenströmen und Byte -Streams. Ein Zeichenstrom (kann jeweils einen Puffer verarbeiten) ist bei einem Betrieb effizienter als ein Bytestrom (jeweils ein Byte).
InputStream
Da InputStream und OutputStream abstakte Klassen sind, können sie nicht angeben, welches IO -Gerät sie entsprechen. Darunter befinden sich viele Unterklassen, einschließlich spezifischer IO -Geräte wie Netzwerke, Pipelines, Speicher, Dateien usw. und deren verschiedenen in tatsächlichen Programmen verwendeten Unterklassenobjekte.
HINWEIS: Wir nennen die IO -Quelle und das Ziel, die der Knotenflussklasse des Streamknotens (Knoten) entsprechen.
HINWEIS: Beim Schreiben des Inhalts von Datei A bis Datei B verwendet das Programm die Ausgabemaßklasse oder die Eingangsklasse für den Betrieb von Datei A A. Die Eingabe- und Ausgabemittel befindet sich relativ zum Programm, nicht im Namen der Datei. Wir sollten daher eine Eingangsklasse erstellen, um die Operation in der Datei A und eine Ausgabemaßnahme zu vervollständigen, um die Operation in Datei B. abzuschließen
Ausgangsstream
Charakter-orientierter Stream-Leser/Schriftsteller
Ein von Unicode -Zeichen gerichteter Stream bedeutet, aus dem Stream zu lesen oder Informationen in den Stream in Unicode -Zeichen zu schreiben. In ähnlicher Weise ist Leser/Schriftsteller auch eine Abstartklasse.
Leser
Schriftsteller
Wiederverwendung von IO -Programmcode:
Verwenden Sie normalerweise beim Schreiben von Code -1 als Ende der Tastatureingabe und verwenden Sie das System nicht direkt in der schriftlichen Funktion. Es ist nur so, dass beim Aufrufen der Funktion das System.in als Parameter übergeben wird. Wenn wir in Zukunft Daten aus einer Datei lesen möchten, um die manuelle Tastatureingabe zu ersetzen, können wir diese Funktion direkt verwenden, sodass das Programm nicht zu viele Änderungen vornehmen muss, um den Effekt der unveränderlichen und Anpassung an Änderungen zu erreichen.
Umwandlung von Byteströmen und Zeichenströmen
InputStreamReader und OutputStreamReader: einen byteorientierten Strom in einen charakterorientierten Strom umwandeln.
Die InputStreamReader -Klasse ist eine Brücke von einem Bytestrom zu einem Zeichenstrom: Sie liest in den Bytes und wandelt sie gemäß der angegebenen Codierungsmethode in einen Zeichenstrom um.
Die verwendete Codierungsmethode kann mit dem Namen oder der Standard -Codierungsmethode angegeben werden, die für die Plattform akzeptabel ist.
Jeder Aufruf einer der Read () -Methoden des InputStreamReaders kann dazu führen, dass ein oder mehrere Bytes aus dem Basis -Byte -Eingangsstrom gelesen werden.
Um eine höhere Effizienz zu erzielen, sollten Sie den InputStreamReader mit BufferedReader einkapseln.
BufferedReader in = neuer BufferedReader (neuer InputStreamReader (System.in));
Eine Zusammenfassung der Verwendung von Java -Streaming
Ich habe in meiner professionellen Arbeit viele Java -Streams begegnet, und die Zusammenfassung ist wie folgt:
1. Erzeugen Sie ZIP -Format. Was Sie begegnen, ist, Zip -Dateien in einem Servlet zu generieren, sie an den Web -Client auszugeben und diese direkt herunterzuladen.
Antwort.SetContentType ("Anwendung/ZIP"); response.addHeader ("Inhaltsdisposition", "Anhang; Dateiname =/" xxx.zip/ ""); ZipoutputStream out = new ZipoutputStream (response.getOutputStream ()) für () {Zipentry -Eintrag = new Zipentry ("aa" + i ".dat"); out.putNewEntry (Eintrag); bytes [] bt = s.getBytes (); out.writebytes (bt, 0, bt.length ()); out.closeEntry (); } out.flush (); out.close (); ZipoutputStream erbt von java.io.filteroutputStream. Daher wird der reale Schreibvorgang über den Parameter -Ausgangsstream geschrieben.
Sein leeres Schreiben (Byte [] b, int off, int len) ruft schließlich auf. Schreiben (b, off, len);
Wenn Sie eine ZIP -Datei generieren möchten, schreiben Sie neuer ZipoutputStream (neuer FileOutputStream (Pfad)).
2. ähnliches Schreiben xml.
Xmlwriter writer = new XMLWriter (neuer FileOutputStream (Pfad), Formatierer)
Writer.Write (DOC). Das Prinzip ähnelt dem oben genannten
3. Schreiben Sie Textdateien und fügen Sie sie hinzu.
Printstream ps = neuer printstream (neuer FileOutputStream (Pfad, True), "UTF-8") Ps.println (s); // kann verschiedene Typen wie boolean, int usw. schreiben.Printsteam erbt auch von filteroutputStream
DataOutputStream out = new DataOutputStream (Socket.getOutputStream ()); out.writebytes (bt); Out.WriteBoolean (Boolean V);
DataOutputStream ist auch ein FilteroutputStream.
5. aus dem Text lesen
BufferedReader reader = neuer bufferedReader (neuer fileReader (path)); Reader.Readline ();
Das BufferedReader -Muster entspricht dem obigen Filtermuster. Es speichert ein Objekt, in dem das Leserobjekt als Parameter übergeben und tatsächlich zum Lesen verwendet wird.
Die Klasse, die Java 1.0 von BufferedReader entspricht, ist BufferedInputStream, ein Filterinputstream.
6. Lesen Sie aus Socket
BufferedInputStream ist = neuer BufferedInputStream (socket.getInputStream ()); is.read (bt, 0, bt.length ());
Zusammenfassen:
Die Basisklassen -Stream -Serie sind InputStream und OutputStream. Sie sind abstrakte Klassen und die einzigen erforderlichen Methoden sind (Ausgang als Beispiel)
void write (int b) wirft ioException aus; void write (byte b []) löst ioExceptionvoid write (byte b [], int off, int len) aus
Das grundlegendste ist die Byte -Operation. Die erste Methode scheint eine Ganzzahl zu schreiben, aber tatsächlich schreibt sie nur ein Byte (die niedrigsten acht Bits). Seine Unterklasse ist in zwei Serien unterteilt, eine soll das Ausgabegerät direkt bedienen. Wir haben oben auf Datei (FileOutputStream) und Servlet Output (ServletOutputStream) gestoßen. Andere häufig verwendete sind auch ein BytearrayoutputStream, der direkt im Speicher betrieben wird.
Als nächstes kommt die FilteroutputStream -Reihe, die einen Ausgangsstream -Objekt -Sitzparameter empfängt, und die reale Schreibvor Operation wird über das Objekt abgeschlossen. Beispielsweise ist ZipoutputStream nur für die Generierung von komprimierten Daten verantwortlich. Ob diese Daten in Datei-, Speicher- oder ServletResponse geschrieben werden, wird sie durch die Eingabeparameter bestimmt. Dies ist das Dekorationsmuster.
Zu den häufig verwendeten Operationen in der Filterserie gehören Printstream (Print, Println, Write (Boolean [int, char, String]) und schließlich mit der Out.Write -Methode, um sie in Bytes zu schreiben.
Es gibt auch DataOutputStream, das WriteByte/WriteBoolean/Writedouble/Writelong/Wiretutf und andere Methoden bereitstellt.
Es gibt auch Sockel/Reißverschluss und andere Dinge, die nicht häufig verwendet werden.
Java -Streaming ist sehr bequem und kompliziert. Komplexität bedeutet, dass die Implementierung einer Funktion häufig mehrere Klassen erfordert, und es gibt mehrere Kombinationen. Es muss noch in der Praxis zusammengefasst werden.