Flux de notes d'étude C #

Tous les travaux d'entrée et de sortie effectués dans le .NET Framework doivent utiliser des flux. Un flux est une représentation abstraite d'un périphérique série. Les appareils de sérialisation peuvent stocker les données de manière linéaire et sont accessibles de la même manière: un octet à la fois.
Il existe deux types de flux:

  • Flux de sortie: lors de l'écriture de données sur une cible externe, il est nécessaire d'utiliser le flux de sortie. Il peut s'agir d'un fichier disque physique, d'un emplacement réseau, d'une imprimante ou d'un autre programme.
  • Flux d'entrée: utilisé pour lire des données en mémoire ou des variables accessibles par le programme. Jusqu'à présent, la forme la plus courante de flux d'entrée que nous avons utilisée est le clavier.
    Les interfaces et les classes associées du flux sont principalement situées dans l' System.IOespace de noms, où la Streamclasse est une classe abstraite, et elle a trois sous-classes importantes pour différents objets d'accès: la FileStreamclasse représente les opérations de fichier, MemoryStreamreprésente les opérations de mémoire et la BufferedStreamclasse représente le traitement du tampon.

Classe 1.Stream

La Streamclasse abstraite contient de nombreux attributs et méthodes requis dans le flux, comme indiqué dans le tableau suivant:
Insérez la description de l'image ici
Insérez la description de l'image ici
Ces attributs et méthodes impliquent tous les aspects de la lecture et de l'écriture du flux. Les 4 méthodes d'opérations de lecture et d'écriture sont les suivantes:

	int ReadByte();
	int Read(byte[] array, int offset, int count);
	void WriteByte(byte value);
	void Write(byte[] array, int offset, int count);

Parmi eux ReadByte(), les octets lus sont convertis en nombres entiers et renvoyés. Si aucun octet n'est lu, retourne -1. Read()La méthode renvoie le nombre d'octets lus.
Par BeginRead(), EndRead(), BeginWrite()et EndWrie()autres, la classe Stream peut soutenir les opérations d' E / S asynchrones.
Seek()Le procédé consiste à localiser le pointeur de recherche dans le flux pour déterminer la position de la prochaine opération de lecture ou d'écriture. Dans un tel flux, sa CanSeekvaleur d'attribut est true, et sa Seek()méthode peut être utilisée pour définir la position du pointeur. Seek()La méthode nécessite deux paramètres: l'un est utilisé pour indiquer la valeur du mouvement du pointeur de recherche et l'autre est utilisé pour déterminer la position de référence du mouvement du pointeur. La position de référence est SeekOriginle membre d'énumération, qui peut être l'une des trois situations suivantes:

  • SeekOrigin.Begin(le début du fichier);
  • SeekOrigin.Current(La position actuelle du pointeur dans le fichier);
  • SeekOrigin.End(Fin du fichier).
    Le code suivant montre comment rechercher dans un fichier:
	aStream.Seek(200, SeekOrigin.Begin);	// 从开头移到200位置
	aStream.Seek(0, SeekOrigin.End);		// 移到文件尾
	aStream.Seek(-20, SeekOrigin.Current);	// 从当前位置反向移动20

Classe 2.FileStream

FileStreamIl en est Streamdirectement dérivé. FileStreamLes objets peuvent lire le contenu de fichiers ou écrire du contenu dans des fichiers et peuvent gérer des octets, des caractères, des chaînes et d'autres types de données. Cet objet peut également être utilisé pour effectuer une entrée / sortie standard et une sortie d'erreur standard.
Il est à noter que l' FileStreamobjet n'est généralement pas utilisé seul, car son application est plus proche de la couche inférieure. Cet objet ne peut lire et écrire que des octets.Par conséquent, lorsque vous l'utilisez, vous devez convertir des chaînes, des nombres et des objets en octets avant de pouvoir leur être transmis FileStream. Compte tenu de cela, il FileStreamest généralement emballé dans d'autres classes pour une utilisation, telles que BinaryWriterou TextReader, ces classes peuvent gérer des structures de données de haut niveau. La classe FileStream a de nombreuses formes de méthodes de construction, donc différentes méthodes de construction peuvent être utilisées selon différentes combinaisons des paramètres suivants FileStream:

  • ① Nom du fichier;
  • ② File handle-un entier utilisé pour représenter le handle de fichier;
  • ③ Access mode-one des valeurs d'énumération FileMode;
  • ④ Droits de lecture / écriture - une des valeurs d'énumération FileAccess;
  • ⑤ Mode de partage - une des valeurs d'énumération FileShare;
  • ⑥ Taille du tampon.

Le Tableau 6-3, le Tableau 6-4 et le Tableau 6-5 décrivent respectivement les modes d'accès aux fichiers, les autorisations d'accès et les modes de partage.
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Par exemple, pour créer un fichier et faire en sorte que le fichier prenne en charge les opérations de lecture partagées:

	FileStream fs = new FileStream(@"c:\temp\foo.txt", FileMode.Create, FileAccess.Reead);

FIleStreamIl peut être de manière synchrone ou asynchrone de créer, en même temps, en dehors de l' Streamajout de la propriété héritée, mais aussi d'augmenter la IsAsyncpropriété. En outre, la méthode répertoriée dans le tableau suivant est ajoutée à cette classe: La
Insérez la description de l'image ici
GetHandle()méthode peut renvoyer un ReadFile()identificateur qui peut être utilisé dans la fonction native du système d'exploitation (comme dans Win32 ), mais cette méthode doit être utilisée avec précaution. Si vous utilisez le descripteur de fichier pour apporter des modifications au fichier sous-jacent, puis essayez d'utiliser le fichier FileStream, cela peut endommager les données du fichier.
FileStreamPendant le fonctionnement de la classe, les exceptions suivantes peuvent être générées:

  • ① ArgumentException —— Le chemin est un caractère nul
  • ② ArgumentNullException-le chemin est une référence nulle
  • ③ SecurityException: aucune autorisation d'opération sur le fichier
  • ④ FileNotFoundException-file not found
  • ⑤ IOException —— D'autres erreurs d'E / S se sont produites, telles que la spécification d'un pilote incorrect
  • ⑥ DirectoryNotFoundException —— Le répertoire n'existe pas

Par exemple, through FileStreampour lire et écrire le contenu du fichier:

using System;
using System.IO;
class Test
{
    
    
	static void Main(){
    
    
		try {
    
    
		FileStream fsw = new FileStream("test.dat", FileMode.Create, FileAccess.Write);

			// Wirte some data to the stream
			fsw.WriteByte(33);
			fsw.Write(new byte[] {
    
     34, 35, 36 }, 0, 3);
			fsw.Close();

			FileStream fsr = new FileStream("test.dat", FileMode.Open, FileAccess.Read);
			Console.WriteLine(fsr.ReadByte());
			Console.WriteLine(fsr.ReadByte());
			Console.WriteLine(fsr.ReadByte());
			Console.WriteLine(fsr.ReadByte());
		} catch (Exception e) {
    
    
			Console.WriteLine("Exception:" + e.ToString());
		}
	}
}

résultat de l'opération:
Insérez la description de l'image ici

Classe 3.MemoryStream

MemoryStreamDe la classe également Streamhéritée, il utilise la mémoire au lieu du fichier pour stocker le flux directement, mais traitant de FileStreamtrès similaires. MemoryStreamLes données sont stockées dans la mémoire sous la forme d'un tableau d'octets et peuvent être utilisées pour remplacer le rôle de fichiers temporaires dans l'application.
Comme avec le FileStreammême, MemoryStreamil existe de nombreuses méthodes de construction. Les deux suivants sont plus couramment utilisés:

	MemoryStream();
	MemoryStream(byte []);

Utilisez la première méthode de construction ici pour établir MemoryStreamque lorsque les données sont écrites à la fin du flux, elles MemoryStreampeuvent être développées en conséquence. La deuxième méthode de construction crée une MemoryStreamnouvelle instance de la classe basée sur le tableau d'octets spécifié , de sorte que le flux créé ne peut pas être redimensionné.
En plus des Streampropriétés héritées, une propriété supplémentaire MemoryStreama été ajoutée Capacity. CapacityL'attribut peut être utilisé pour indiquer le nombre d'octets actuellement alloués au flux. Cet attribut est très utile lors de l'utilisation de flux basés sur un tableau d'octets, car cet attribut peut indiquer la taille du tableau et l' Lengthattribut peut indiquer le nombre d'octets actuellement utilisés.
MemoryStreamIl n'est pas possible d'exécuter des méthodes de lecture / écriture asynchrones car cette fonctionnalité n'est pas requise pour les E / S mémoire. Mais l'objet peut exécuter les trois méthodes supplémentaires suivantes.

  • ① —— GetBuffer()Renvoie une référence au tableau d'octets dans le flux
  • ② —— Ecrire ToArray()tout le contenu dans le tableau d'octets
  • ③ —— Ecrire WriteTo()le contenu du flux dans un autre flux

Par exemple, utilisez MemoryStream pour opérer sur la mémoire:

using System;
using System.IO;
class Test
{
    
    
	static void Main(){
    
    
		try {
    
    
			byte[] ary = {
    
     33, 34, 35, 36, 37 };
			int b;

			MemoryStream msr = new MemoryStream(ary);
			MemoryStream msw = new MemoryStream();

			while ((b = msr.ReadByte()) != -1) {
    
    
				msw.WriteByte((byte)(b + 3));
			}
			byte[] result = msw.ToArray();

			foreach (byte bt in result)
				Console.WriteLine(bt);

		} catch (Exception e) {
    
    
			Console.WriteLine("Exception:" + e.ToString());
		}
	}
}

résultat de l'opération:
Insérez la description de l'image ici

4.BufferedStrea 类

BufferedStreamPeut améliorer l'efficacité d'exécution des opérations de lecture et d'écriture, car cette classe peut mettre en cache des données en mémoire, réduisant ainsi le nombre d'appels au système d'exploitation. BufferedStreamIl ne peut pas être utilisé seul, mais doit être conditionné dans d'autres types de flux, en particulier les types BinaryWriteret BinaryReadertypes décrits ci-dessous . De plus, il est également courant de mettre en cache et d'encapsuler le flux réseau (NetworkStream). Pour l' opération d' BinaryStreamappel Flush(), le contenu mis en cache peut être écrit dans le flux.

Je suppose que tu aimes

Origine blog.csdn.net/qq_45349225/article/details/114373805
conseillé
Classement