Maison  >  Article  >  Java  >  Compilation détaillée des informations sur le flux d'E/S pour la programmation Java

Compilation détaillée des informations sur le flux d'E/S pour la programmation Java

黄舟
黄舟original
2017-03-06 10:37:42999parcourir

Cet article présente principalement en détail les informations pertinentes sur le flux d'IO de programmation Java. Les amis qui en ont besoin peuvent se référer à

explication détaillée de Java IO :

Java. Classes ou interfaces liées aux opérations de flux :

Structure du diagramme de classes de flux Java :

Le concept de flux Et fonction

Un flux est un ensemble d'octets séquentiels avec un point de départ et un point final. C'est un terme général ou abstrait pour la transmission de données. Autrement dit, la transmission de données entre deux appareils est appelée un flux. L'essence d'un flux est la transmission de données. Selon les caractéristiques de la transmission de données, le flux est divisé en différentes catégories pour faciliter des opérations de données plus intuitives.

Classification des flux IO

  • Selon les différents types de données traitées, elles sont divisées en : flux de caractères et flux d'octets

  • Selon différentes directions de flux de données, il est divisé en : flux d'entrée et flux de sortie

flux de caractères et flux d'octets

L'origine du flux de caractères : En raison des différents encodages de données, il existe des objets flux qui effectuent des opérations efficaces sur les caractères. L'essence est en fait de vérifier la table de codes spécifiée lors de la lecture en fonction du flux d'octets. La différence entre le flux d'octets et le flux de caractères :

  • Les unités de lecture et d'écriture sont différentes : le flux d'octets est en octets (8 bits) comme unité, le flux de caractères est en caractères comme unité. unité, et les caractères sont mappés selon la table de codes, plusieurs octets peuvent être lus à la fois.

  • Les objets de traitement sont différents : le flux d'octets peut traiter tous les types de données (comme les images, avi, etc.), tandis que le flux de caractères ne peut traiter que les données de type caractère.

Conclusion : tant que vous traitez des données en texte brut, privilégiez l'utilisation de flux de caractères. Sinon, des flux d'octets sont utilisés.

Flux d'entrée et flux de sortie

Le flux d'entrée ne peut être que lu et le flux de sortie ne peut être qu'écrit. Le programme doit utiliser différents flux en fonction des différentes caractéristiques des données. être transmis.

Objet de flux Java IO

1. Flux d'octets d'entrée Le diagramme d'héritage du flux d'octets d'entrée dans InputStreamIO peut être vu dans la figure ci-dessus, comme on peut le voir :

  1. InputStream est la classe parent de tous les flux d'octets d'entrée, c'est une classe abstraite.

  2. ByteArrayInputStream, StringBufferInputStream et FileInputStream sont trois flux multimédias de base. Ils lisent respectivement les données des tableaux d'octets, de StringBuffer et des fichiers locaux. PipedInputStream lit les données d'un canal partagé avec d'autres threads. Les connaissances liées à Piped seront présentées séparément plus tard.

  3. ObjectInputStream et toutes les sous-classes de FilterInputStream sont des flux de décoration (les protagonistes du modèle de décorateur). 2. Flux d'octets de sortie OutputStream

Le diagramme d'héritage du flux d'octets de sortie dans IO peut être vu dans la figure ci-dessus. On peut voir que :

OutputStream est. Tous les flux d'octets de sortie La classe parent de , qui est une classe abstraite. ByteArrayOutputStream et FileOutputStream sont deux flux multimédias de base. Ils écrivent respectivement des données dans des tableaux d'octets et des fichiers locaux. PipedOutputStream écrit des données dans un canal partagé avec d'autres threads ObjectOutputStream et toutes les sous-classes de FilterOutputStream sont des flux de décoration. 3. La correspondance entre l'entrée et la sortie du flux d'octets

La partie bleue dans l'image est la partie correspondante principale, et la partie rouge est la partie non correspondante . La ligne pointillée violette indique que ces flux sont généralement utilisés ensemble . Comme le montre la figure ci-dessus, le flux d'octets dans Java IO est extrêmement symétrique. "Existence et raisonnabilité" Jetons un coup d'œil à certaines des classes les moins symétriques dans ces flux d'octets !

1.LineNumberInputStream termine principalement la lecture des données du flux et obtiendra le numéro de ligne correspondant Quant au moment et à l'endroit où bifurquer, il est déterminé activement par le changement de classe, et il n'y en a pas dans le. Numéro de ligne d'origine. Il n'y a pas de partie correspondante dans la partie de sortie. Nous pouvons créer nous-mêmes un LineNumberOutputStream. Il y aura un numéro de ligne de base lors de l'écriture initiale. À l'avenir, un numéro de ligne sera ajouté à la ligne suivante chaque fois qu'un saut de ligne sera rencontré. Cela semble aller. Cela semble encore moins populaire.

2. La fonction de PushbackInputStream est de vérifier le dernier octet et de le mettre dans le tampon s'il n'est pas satisfait. Principalement utilisé dans les parties syntaxe et analyse lexicale du compilateur. Le BufferedOutputStream dans la partie sortie implémente presque des fonctions similaires.

3.StringBufferInputStream est obsolète et ne devrait pas apparaître dans la partie InputStream, principalement parce que String doit appartenir à la portée du flux de caractères. Il a été abandonné, bien sûr il n'y en a pas besoin dans la partie sortie ! Il est également autorisé à exister simplement pour maintenir la compatibilité ascendante des versions.

4. SequenceInputStream peut être considéré comme une classe d'outils qui lit deux ou plusieurs flux d'entrée comme un seul flux d'entrée en séquence. Il peut être complètement supprimé du package IO, et cela n'affecte pas du tout la structure du package IO, mais le rend plus "pur" - le mode Décorateur pur.

5.PrintStream peut également être considéré comme un outil auxiliaire. Il peut principalement écrire des données sur d'autres flux de sortie ou FileInputStream, et son implémentation interne est toujours mise en mémoire tampon. Il s’agit essentiellement d’un simple outil pour l’application globale d’autres flux. Vous pouvez également supprimer les packages IO ! System.out et System.out sont des instances de PrintStream !

4. Lecteur de flux d'entrée de caractères

Comme on peut le voir dans le diagramme d'héritage ci-dessus :

1.Reader est tous les flux de caractères d'entrée Le parent classe de , qui est une classe abstraite.

2.CharReader et StringReader sont deux flux multimédias de base, qui lisent respectivement les données du tableau Char et de la chaîne. PipedReader lit les données d'un canal partagé avec d'autres threads.

3.BufferedReader est évidemment un décorateur. Lui et ses sous-classes sont responsables de la décoration d'autres objets Reader.

4.FilterReader est la classe parent de tous les flux de décoration spécifiques personnalisés. Sa sous-classe PushbackReader décore l'objet Reader et ajoute un numéro de ligne.

5.InputStreamReader est un pont reliant le flux d'octets et le flux de caractères. Il convertit le flux d'octets en flux de caractères. FileReader peut être considéré comme une classe d'outils couramment utilisée pour réaliser cette fonction. Dans son code source, la méthode de conversion de FileInputStream en Reader est évidemment utilisée. Nous pouvons obtenir certaines astuces de cette classe. Les objectifs et les méthodes d'utilisation de chaque classe dans Reader sont fondamentalement les mêmes que ceux d'InputStream. Il y aura une relation correspondante entre Reader et InputStream plus tard. 5. Flux de sortie de caractères Writer

Comme on peut le voir dans le diagramme de relations ci-dessus :

1.Writer est la classe parent de tous les flux de caractères de sortie, et c'est une classe abstraite.

2.CharArrayWriter et StringWriter sont deux flux multimédias de base. Ils écrivent respectivement des données dans un tableau Char et une chaîne. PipedWriter écrit des données dans un tube partagé avec d'autres threads

3. BufferedWriter est un décorateur qui fournit une fonction de mise en mémoire tampon pour Writer.

4.PrintWriter et PrintStream sont très similaires, et leurs fonctions et utilisations sont également très similaires.

5. OutputStreamWriter est le pont pour la conversion de OutputStream vers Writer. Sa sous-classe FileWriter est en fait une classe spécifique qui implémente cette fonction (vous pouvez étudier SourceCode pour plus de détails). Les fonctions et l'utilisation sont très similaires à OutputStream, et leurs diagrammes correspondants seront présentés plus tard. 6. Correspondance entre l'entrée et la sortie du flux de caractères

7. Conversion du flux de caractères et du flux d'octets

Caractéristiques du flux de conversion :

  1. C'est un pont entre le flux de caractères et le flux d'octets

  2. Peut convertir les données d'octet lues via un encodage spécifié en caractères

  3. peut convertir les données de caractères lues en octets via l'encodage spécifié

Quand utiliser le flux de conversion ?

  1. Lorsqu'il y a une action de conversion entre les octets et les caractères ;

  2. Lorsque les données de l'opération de flux doivent être codées ou décodées.

Incarnation d'objet spécifique :

  1. InputStreamReader :Pont d'octet à caractère

  2. OutputStreamWriter :Character to byte bridge

Ces deux objets flux sont membres du système de caractères et eux-mêmes sont des flux de caractères. vous devez transmettre un objet de flux d'octets pendant la construction.

8.Classe File

La classe File est un objet qui encapsule les fichiers et les dossiers dans le système de fichiers. Les fichiers et les dossiers peuvent être manipulés grâce à l'idée d'objets. . La classe File enregistre diverses informations de métadonnées de fichiers ou de répertoires, notamment le nom du fichier, la longueur du fichier, l'heure de la dernière modification, sa lisibilité, l'obtention du nom de chemin du fichier actuel, la détermination de l'existence du fichier spécifié, l'obtention de la liste des fichiers dans le répertoire actuel, et création, suppression de fichiers et de répertoires, etc.

9.Classe RandomAccessFile

Cet objet n'est pas membre du système de flux Il encapsule le flux d'octets et encapsule également un tampon (tableau de caractères), fait fonctionner le. données dans le tableau de caractères via le pointeur interne. Caractéristiques de cet objet :

Cet objet ne peut gérer que des fichiers, le constructeur reçoit donc deux types de paramètres : a. Chemin du fichier String ; b. Cet objet peut à la fois lire et écrire des fichiers. Lors de l'instanciation de l'objet, vous pouvez spécifier le mode de fonctionnement (r, rw)

Remarque : L'objet est instancié, si le fichier doit être exploité. n'existe pas, il sera créé automatiquement ; si le fichier existe et que l'emplacement des données d'écriture n'est pas spécifié, il sera écrit depuis le début, c'est-à-dire que le contenu original sera écrasé. peut être utilisé pour le téléchargement multithread ou pour plusieurs threads écrivant des données dans des fichiers en même temps.

Ce qui précède est le contenu détaillé des informations sur le flux d'E/S de la programmation Java. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn