Ich habe versucht, die Beziehung zwischen Klassen wie java.io.InputStream herauszufinden

Einführung

Seit Java SE 7 gibt es nützlichere Klassen und weniger direkten Kontakt zu java.io [] -Klassen. Als ich InputStream [] neulich zum ersten Mal seit einiger Zeit live verwendet habe, habe ich gegoogelt, weil ich nicht wusste, wie ich es verwenden soll, also habe ich ein Diagramm erstellt.

Es gibt viele Klassen, die ich nicht verwendet habe. Wenn Sie also eine Geschichte haben, die Sie tatsächlich so verwenden können, kommentieren Sie dies bitte.

Das Ergebnis der Organisation

Es wurde wie folgt. Dies dient jedoch der Klarheit und ist nicht genau. Der Grund wird später beschrieben.

Lesen (InputStream, Reader)

読み込み.png

Schreiben (OutputStream, Writer)

書き込み.png

Warum ich es nicht richtig geschrieben habe

Aus verschiedenen Gründen wage ich es, es ungenau zu machen.

Klasse nicht eingetragen

Die folgenden Klassen sind ausgeschlossen.

Veraltete Klasse

Diese beiden wurden ausgeschlossen, da sie aufgrund eines Konstruktionsfehlers veraltet waren.

LineNumberInputStream

Diese Klasse geht von einer falschen Wahrnehmung aus, dass Zeichen ordnungsgemäß durch Bytes dargestellt werden.

StringBufferInputStream

Die Konvertierung von Zeichen in Byte wird in dieser Klasse nicht korrekt durchgeführt.

Filter

Diese beiden sind ausgeschlossen, da sie niemals alleine verwendet werden. Ich habe mich gefragt, warum ich es nicht abstrakt gestaltet habe, aber es scheint, dass es andere Menschen gibt, die die gleiche Frage haben.

java - Why FilterInputStream is not Abstract Class - Stack Overflow

Ich glaube nicht, dass ich diesen FilterOutputStream [] überhaupt brauche.

Ich bin einfach nicht in die Figur gekommen

Ich habe diese ausgeschlossen, weil ich keine gute Position gefunden habe. Vielleicht sollte das Rohr eine separate Figur sein.

Ich habe SequenceInputStream [] nicht verwendet, aber es ist eine spezielle Klasse, die InputStream [] verkettet. Selbst wenn ich es in die Abbildung setze, frage ich mich, ob es in der Ecke einsam sein wird.

Vererbungsbeziehung wird nicht beschrieben

Beispielsweise erben DataInputStream [], ObjectInputStream [] von InputStream [], lassen es jedoch weg. DataOutputStream [], ObjectOutputStream [] erbt von OutputStream [], lässt es jedoch weg.

Der Grund dafür ist, dass diese zum Lesen und Schreiben primitiver Typen bzw. Objekte verwendet werden und es anscheinend keine andere Szene gibt, die sie als InputStream übergibt.

Wenn dies beispielsweise PushbackInputStream [] ist, sollte es als "Lesen Sie die ersten paar Bytes, um das Dateiformat automatisch zu bestimmen, und lesen Sie dann den Inhalt als InputStream []" verwendet werden.

Außerdem erbt ObjectInputStream [] direkt InputStream [], aber ich denke, es ist auch schwer zu verstehen, dass DataInputStream [] FilterInputStream [] dazwischen hat. Es scheint, dass es andere Menschen gibt, die ähnliche Fragen haben.

Was mir nach der Organisation aufgefallen ist

Namensregeln sind schwer zu verstehen

Diese haben alle die Namenskonventionen "XXXInputStream", "XXXOutputStream", "XXXReader", "XXXWriter". Daher ist es schwierig zu unterscheiden und es ist eine Quelle der Verwirrung.

Die Handhabung der Codierung ist unterschiedlich

Für die drei Klassen mit farbigem Hintergrund in der Abbildung ist der Umgang mit der Codierung subtil.

FileReader [], FileWriter [] haben keinen Konstruktor zum Angeben der Codierung. Also habe ich es in die Abbildung eingefügt, aber Sie sollten es ignorieren. Es wird gesagt, dass FileReader [] langsam ist, und jetzt gibt es [Files # newBufferedReader] [].

PrintStream [] hat PrintWriter [], daher bin ich mir nicht sicher, wie ich damit umgehen soll.

Die PrintWriter-Klasse wird in Situationen verwendet, in denen Zeichen anstelle von Bytes geschrieben werden müssen.

Es heißt, aber ich frage mich, ob es nur für System.out [] und System.err [] übrig bleibt.

abschließend

Bei Betrachtung der Figur war es überraschend einfach (´ω`)

Außerdem dachte ich, es würde einige Zeit dauern, den Link zu setzen (´ ・ ω ・ `)

Recommended Posts

Ich habe versucht, die Beziehung zwischen Klassen wie java.io.InputStream herauszufinden
[Metall] Ich habe versucht, den Fluss bis zum Rendern mit Metall herauszufinden
Ich habe versucht, die Methode zu erklären
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, den Ablauf bei der Bildanalyse mit Vision Framework und Core ML herauszufinden
Ruby: Ich habe versucht herauszufinden, wohin Nokogiri geht, um die Kodierung selbst zu sehen
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
In der Abbildung verstandene Java-Klassen und -Instanzen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich musste herausfinden, wo sich der Ordner mit den Eclipse-Plugins auf meinem Mac befand. (Memo)
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, das GitHub-Repository als Bibliotheksserver zu verwenden
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, eine Validierung durchzuführen, um zu vereinheitlichen, wie Hash-Tags geschrieben werden
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Daten sortieren Absteigend, aufsteigend / Schienen
[Rubiy] Heute Abend habe ich versucht, die Schleifenverarbeitung zusammenzufassen [Zeiten, Pause ...]
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Sondervortrag über Multiskalensimulation: Ich habe versucht, den 5. zusammenzufassen
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Sondervortrag über Multi-Scale-Simulation: Ich habe versucht, den 8. zusammenzufassen
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Sondervortrag über Multi-Scale-Simulation: Ich habe versucht, den 7. zusammenzufassen
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen