J'ai essayé de comprendre la relation entre des classes telles que java.io.InputStream

introduction

Depuis Java SE 7, il existe des classes plus utiles et moins de contacts directs avec les classes java.io []. Cependant, quand j'ai utilisé InputStream [] en direct pour la première fois depuis un moment l'autre jour, j'ai cherché sur Google parce que je ne savais pas comment l'utiliser, alors j'ai fait un diagramme.

Il y a beaucoup de classes que je n'ai pas utilisées, donc si vous avez une histoire sur la façon de l'utiliser comme ça, veuillez commenter.

Le résultat de l'organisation

C'est devenu comme suit. Cependant, c'est pour plus de clarté et n'est pas exact. La raison sera décrite plus tard.

Lire (InputStream, Reader)

読み込み.png

Écriture (OutputStream, Writer)

書き込み.png

Pourquoi je ne l'ai pas écrit correctement

Pour diverses raisons, j'ose le rendre inexact.

Classe non inscrite

Les classes suivantes sont exclues.

Classe obsolète

Ces deux ont été déconseillés en raison d'une erreur de conception et ont été exclus.

LineNumberInputStream

Cette classe suppose une fausse perception que les caractères sont correctement représentés par des octets.

StringBufferInputStream

La conversion de caractère en octet n'est pas effectuée correctement dans cette classe.

filtre

Ces deux sont exclus car ils ne sont jamais utilisés seuls. Je me suis demandé pourquoi je ne l'avais pas conçu pour être abstrait, mais il semble qu'il y ait d'autres personnes qui ont la même question.

java - Why FilterInputStream is not Abstract Class - Stack Overflow

Je ne pense pas avoir besoin de ce FilterOutputStream [] en premier lieu.

Je ne suis juste pas entré dans la figure

Celles-ci sont exclues car je n'ai pas trouvé de poste convenable. Peut-être que le tuyau devrait être une figure distincte.

Je n'ai pas utilisé SequenceInputStream [], mais c'est une classe spéciale qui concatène InputStream [], donc même si je le mets dans la figure, je me demande si ce sera solitaire dans le coin.

La relation d'héritage n'est pas décrite

Par exemple, DataInputStream [], ObjectInputStream [] héritent de InputStream [], mais l'omettent. DataOutputStream [], ObjectOutputStream [] hérite de OutputStream [], mais l'omet.

La raison en est que ceux-ci sont utilisés pour lire et écrire des types primitifs et des objets, respectivement, et il ne semble y avoir aucune autre scène pour les passer en tant que InputStream.

S'il s'agit, par exemple, de PushbackInputStream [], il devrait être utilisé comme "lire les premiers octets pour déterminer automatiquement le format de fichier, puis lire le contenu comme InputStream []".

De plus, ObjectInputStream [] hérite directement de InputStream [], mais je pense qu'il est également difficile de comprendre que DataInputStream [] a FilterInputStream [] entre les deux. Il semble qu'il y ait d'autres personnes qui ont des questions similaires.

Ce que j'ai remarqué après avoir organisé

Les règles de dénomination sont difficiles à comprendre

Ils ont tous les conventions de dénomination XXXInputStream, XXXOutputStream, XXXReader, XXXWriter. Par conséquent, il est difficile de le distinguer et c'est une source de confusion.

La gestion de l'encodage est différente

Pour les trois classes avec des arrière-plans colorés dans la figure, la gestion de l'encodage est subtile.

FileReader [], FileWriter [] n'ont pas de constructeur pour spécifier l'encodage. Alors je l'ai mis dans la figure, mais vous devriez l'ignorer. On dit que FileReader [] est lent, et maintenant il y a [Files # newBufferedReader] [].

PrintStream [] a PrintWriter [], donc je ne suis pas sûr de savoir comment le gérer.

La classe PrintWriter est utilisée dans les situations où il est nécessaire d'écrire des caractères au lieu d'octets.

Cela dit, mais je me demande si c'est juste pour System.out [] et System.err [].

en conclusion

En regardant la figure, c'était étonnamment simple (´ω`)

De plus, j'ai pensé qu'il faudrait un certain temps pour mettre le lien (´ ・ ω ・ `)

Recommended Posts

J'ai essayé de comprendre la relation entre des classes telles que java.io.InputStream
[Metal] J'ai essayé de comprendre le flux jusqu'au rendu avec Metal
J'ai essayé d'expliquer la méthode
J'ai essayé de résumer les méthodes utilisées
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
J'ai essayé de comprendre le flux lors de l'analyse d'image avec Vision Framework et Core ML
Ruby: J'ai essayé de savoir où Nokogiri va voir l'encodage lui-même
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
J'ai essayé de configurer tomcat pour exécuter le servlet.
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Classes et instances Java comprises dans la figure
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai dû déterminer où se trouvait le dossier des plugins eclipse sur mon Mac. (Note)
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé d'utiliser le référentiel GitHub comme serveur de bibliothèque
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai essayé de résumer les bases de kotlin et java
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de valider pour unifier comment écrire des balises de hachage
J'ai essayé le problème FizzBuzz
J'ai essayé de vérifier yum-cron
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
Tri des données Décroissant, croissant / Rails
[Rubiy] J'ai essayé de résumer le traitement de la boucle ce soir [fois, pause ...]
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Conférence spéciale sur la simulation multi-échelles: j'ai essayé de résumer le 5e
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
Conférence spéciale sur la simulation multi-échelles: j'ai essayé de résumer le 8
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
Conférence spéciale sur la simulation multi-échelles: j'ai essayé de résumer le 7
J'ai essayé de résoudre le problème de Google Tech Dev Guide