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.
C'est devenu comme suit. Cependant, c'est pour plus de clarté et n'est pas exact. La raison sera décrite plus tard.
Pour diverses raisons, j'ose le rendre inexact.
Les classes suivantes sont exclues.
Ces deux ont été déconseillés en raison d'une erreur de conception et ont été exclus.
Cette classe suppose une fausse perception que les caractères sont correctement représentés par des octets.
La conversion de caractère en octet n'est pas effectuée correctement dans cette classe.
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.
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.
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.
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.
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 regardant la figure, c'était étonnamment simple (´ω`)
De plus, j'ai pensé qu'il faudrait un certain temps pour mettre le lien (´ ・ ω ・ `)
Recommended Posts