Les flux sont un concept abstrait de séquences d'octets.
Les fichiers sont des formes de stockage statiques de données, tandis que les flux se réfèrent au formulaire lorsque les données sont transmises.
Les classes de flux sont divisées en deux principales catégories: les classes de flux de nœuds et les classes de flux filtrées (également appelées classes de flux de processus).
La classe correspondant au périphérique cible est appelée classe de flux de nœud. Le programme peut également appeler la classe de flux de nœuds via une classe de flux indirecte pour obtenir une lecture plus flexible et pratique de divers types de données. Cette classe d'écoulement indirecte est la classe de flux de filtre (également appelé la classe de flux de traitement) ou la classe de packaging.
Le processus d'appel de la classe de wrapper est le suivant:
La relation entre la classification des flux
Peu importe à quel point la classification des flux est riche et complexe, ses racines proviennent de quatre classes de base. La relation entre ces quatre classes est la suivante:
| Ruisseau d'octets | Flux de personnage | |
| Flux d'entrée | Entrée | Lecteur |
| Flux de sortie | Sortie de sortie | Écrivain |
Unicode code pour les caractères stockés dans Java, et la classe de traitement de flux de caractères est responsable de la conversion d'autres flux de caractères codés externes et des flux de caractères Unicode dans Java. Les classes InputStreamReader et OutputStreamWriter Gire les conversions de flux de caractères et de flux d'octets. Un flux de caractères (peut gérer un tampon à la fois) est plus efficace à une opération qu'un flux d'octets (un octet à la fois).
Entrée
Étant donné que InputStream et OutputStream sont des classes abstactes, ils ne peuvent pas indiquer à quel périphérique IO ils correspondent. Il existe de nombreuses sous-classes en dessous d'eux, y compris des appareils IO spécifiques tels que les réseaux, les pipelines, la mémoire, les fichiers, etc., et leurs divers objets de sous-classe utilisés dans les programmes réels.
Remarque: nous appelons la source et la cible IO correspondant à la classe de flux de nœud le nœud de flux (nœud).
Remarque: Lors de l'écriture du contenu du fichier A dans le fichier B, le programme utilise la classe de sortie ou la classe d'entrée pour le fonctionnement du fichier A. La classe d'entrée et de sortie est relative au programme, et non au nom du fichier, nous devons donc créer une classe d'entrée pour terminer l'opération sur le fichier A et une classe de sortie pour terminer l'opération sur le fichier B.
Sortie de sortie
Lecteur de flux / écrivain axé sur les personnages
Un flux réalisé par les caractères Unicode signifie lire à partir du flux ou écrire des informations dans le flux dans les caractères Unicode. De même, le lecteur / écrivain est également une classe abstacte.
Lecteur
Écrivain
Réutilisation du code du programme IO:
Habituellement, lors de l'écriture de code, utilisez -1 comme fin de l'entrée du clavier et n'utilisez pas System.in directement dans la fonction écrite. C'est juste que lors de l'appel de la fonction, System.in est passé en tant que paramètre. De cette façon, lorsque nous voulons lire les données d'un fichier à l'avenir pour remplacer l'entrée du clavier manuel, nous pouvons utiliser cette fonction directement, de sorte que le programme n'a pas besoin de faire trop de modifications, afin d'atteindre l'effet de l'inchange et de l'adaptation aux changements.
Conversion des flux d'octets et des flux de caractères
InputStreamReader et OutputStreamReader: convertissez un flux orienté octet en un flux orienté versant.
La classe InputStreamReader est un pont d'un flux d'octets vers un flux de caractères: il lit dans les octets et le convertit en flux de caractères en fonction de la méthode de codage spécifiée.
La méthode de codage utilisée peut être spécifiée par le nom, ou la méthode de codage par défaut acceptable pour la plate-forme.
Chaque appel à l'une des méthodes de lecture () de InputStreamReader peut faire lire un ou plusieurs octets à partir du flux d'entrée de base de base.
Afin d'atteindre une efficacité plus élevée, envisagez d'encapsulant le lecteur InputStreamRed avec BufferedReader.
BufferedReader dans = new BufferedReader (new InputStreamReader (System.in));
Un résumé de l'utilisation de streaming Java
J'ai rencontré de nombreux flux Java dans mon travail le plus professionnel, et le résumé est le suivant:
1. Générez le format zip. Ce que vous rencontrez est de générer des fichiers ZIP dans un servlet, de les sortir au client Web et de les télécharger directement.
réponse.setContentType ("application / zip"); Response.AddHeader ("Content-Disposition", "Pixe; FileName = /" xxx.zip/ ""); ZipOutputStream out = new ZipOutputStream (réponse.getOutputStream ()) pour () {Zipentry Entry = new Zipentry ("aa" + i ".dat"); out.putNewentry (entrée); octets [] bt = s.getBytes (); out.writeBytes (bt, 0, bt.length ()); out.closeEntry (); } out.flush (); out.close (); ZipOutputStream hérite de java.io.filterOutputStream. Par conséquent, l'opération d'écriture réelle est écrite via le paramètre OutputStream OUT.
Son vide écrit (byte [] b, int off, int len) appelle enfin.write (b, off, len);
Si vous souhaitez générer un fichier zip, écrivez un nouveau zipOutputStream (new FileOutputStream (path));
2. Écriture similaire XML.
Xmlwriter writer = new XMLWriter (new FileOutputStream (chemin), format)
Écrivain.write (doc). Le principe est similaire à ce qui précède
3. Écrivez des fichiers texte et ajoutez-les.
PrintStream ps = new printStream (new FileOutputStream (path, true), "utf-8") ps.println (s); // peut écrire différents types tels que booléen, int, etc.Printsteam hérite également de filterOutStream
DataOutputStream out = new DataOutputStream (socket.getOutputStream ()); out.writeBytes (BT); out.writeboolean (Boolean V);
DataOutputStream est également un filterOutputStream.
5. Lire à partir du texte
BufferedReader Reader = new BufferedReader (nouveau FileReader (Path)); Reader.Readline ();
Le motif BufferedReader est le même que le modèle de filtre ci-dessus. Il stocke un objet dans lequel l'objet lecteur est passé comme paramètre et utilisé pour lire.
La classe correspondant à Java 1.0 de BufferedReader est BufferedInputStream, qui est un filterInputStream.
6. Lire de Socket
BufferedInputStream est = new BufferedInputStream (socket.getInputStream ()); is.read (bt, 0, bt.length ());
Résumer:
Les séries de flux de classe de base sont InputStream et OutputStream. Ce sont des classes abstraites et les seules méthodes requises sont (prenez la sortie comme exemple)
VOID WRITE (INT B) lève IOException; Void Write (Byte B []) lève IOExceptionVoid Write (Byte B [], int Off, int len)
La chose la plus fondamentale est le fonctionnement des octets. La première méthode semble écrire un entier, mais en fait il n'écrit qu'un octet (les huit bits les plus bas). Sa sous-classe est divisée en deux séries, l'une doit utiliser directement le périphérique de sortie. Ce que nous avons rencontré ci-dessus est le fichier (fileoutputStream) et le servlet (servletOutputStream). D'autres couramment utilisés sont également un bytearrayoutputStream, qui fonctionne directement en mémoire.
Vient ensuite la série FilterOutputStream, qui reçoit un paramètre de siège d'objet OutputStream, et l'opération d'écriture réelle est terminée via l'objet. Par exemple, ZipOutputStream n'est responsable que de la génération de données compressées. Quant à savoir si ces données sont écrites dans le fichier, la mémoire ou le servletResponse, il est déterminé par les paramètres d'entrée. Ceci est le motif du décorateur.
Les opérations couramment utilisées dans la série Filter incluent PrintStream (fournissant Print, Println, Write (Boolean [INT, CHAR, String]) et enfin en utilisant la méthode Out.Write pour l'écrire en octets.
Il existe également DataOutputStream, qui fournit des méthodes WriteByte / WriteBoolean / Wretedouble / WriteLong / WiTutf et d'autres méthodes.
Il existe également des douilles / zip et d'autres choses qui ne sont pas couramment utilisées.
Le streaming Java est très pratique et compliqué. La complexité signifie que la mise en œuvre d'une fonction nécessite souvent plusieurs classes, et il existe plusieurs combinaisons. Il doit encore être résumé dans la pratique.