Contenu d'un objet de type FileStream
Bonsoir,
D'après mes connaissances, un fichier de type FileStream contient une sequence de bytes.
Cependant, ces bytes sont ils représentés sous forme binaire, hexadécimale ou pas forcément.
Quand je déboggue le programme suivant, je constate que dans le fichier de destination collection_nombres.bin, les données apparaissent au format hexadecimal.
Est-ce toujours ainsi ou cela varie -t-il (format binaire par exemple)en fonction de certains facteurs ?
Les données du fichier destFile de type FileStream qui migrent vers le fichier de destination collection_nombres.bin sont elles stockées automatiquement au même format dans ces deux fichiers?
Pour finir,pouvez-vous me confirmer qu'un objet de type Stream n'est utile en soi que parce qu'on peut accéder à ses données par le biais d'un objet de type BinaryReader ou BinaryWriter ou encore de type StreamReader ou StreamWriter.
Autre question : en quoi utiliser un objet de type FileStream améliore les performances d'une application?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
public void test_writer()
{
//création d'un BinaryWriter
string destinationFilePath = @"C:\Users\har@43\Documents\collection_nombres.bin";
//Collection de bytes
byte[] dataCollection = {1,4,6,7,12,33,26,98,82,101};
//création d'un objet de type fileStream par le biais dulequel on peut interagir avec le ficher source
FileStream destFile= new FileStream(destinationFilePath, FileMode.Create,FileAccess.Write);
//on crée un objet de type BinaryWriter qui agit sur l'objet de type Stream
BinaryWriter writer = new BinaryWriter(destFile);
//on ecrit chaque byte verrs le stream
foreach (byte data in dataCollection){
writer.Write(data);
}
//fermeture du stream et de l'objet BinaryWriter pour que les données soient inscrites
//dans le fichier de destination
writer.Close();
destFile.Close();
} |
Pour finir, quand on lit par la méthode Read , les données contenues dans un dans un objet de type StreamReader, provenant d'un fichier texte, on obtient , par le biais d'un conversion en char, le caractère lu , comme le montre le code ci-dessous.
On sait que la méthode Read retourne une valeur de type int qui est celle de la valeur du byte lu; je ne comprends pas alors que la conversion en char puisse fonctionner .
Je vous remercie beaucoup de bien vouloir m'aider sur ce point.
Cordialement.
new_wave
Code:
1 2 3 4 5 6 7 8 9 10 11
|
StreamReader reader = new StreamReader(sourceFile);
StringBuilder filecontents = new StringBuilder();
while(reader.Peek()!=-1){
fileContents.Append((char)reader.Read());
}
string Data = fileContents.ToString();
reader.Close();
sourceFile.close(); |
Merci beaucoup de votre aide sur tous ces points .
Cordialement.
curieuse_prog
représentation des données --notions de stream
Bonjour et merci beaucoup de ta réponse.
J'ai donc bien noté toutes tes explications et t'en remercie.
Je m'excuse de la confusion que j'ai faite en écrivant qu'un "un fichier de type FileStream contient une sequence de bytes.".
J'ai bien compris qu'il s'agit d'une variable de type Stream et non d'un fichier de ce type mais la fatigue aidant et associant souvent une variable de type Stream au contenu d'un fichier j'ai commis cette erreur.
J'ai maintenant les questions auxquelles je te remercie de bien vouloir répondre:
1-Comment les données contenues dans un Stream finissent par se retrouver dans un fichier de destination:Y-a-il un flush automatique du Stream vers le fichier de destination?
2-Supposons que nous voulons écrire des données de type caractère dans un fichier texte de destination.
Comment les données binaires contenues dans le Stream grâce à l'intervention d'un StreamWriter peuvent se retrouver sous forme caractère dans le fichier de destination alors qu'elles sont sous forme binaire dans le Stream.
Merci beaucoup de ton aide sur ces deux points.
Cordialement.
new_wave
contenu d'un objet de type FileStream
Bonjour et merci beaucoup de ta réponse qui m'éclaircit un peu plus .
Tu écris
Citation:
Les données ne sont jamais "sous forme caractère dans le fichier", elles sont toujours sous forme binaire... Le fait de les traiter comme des caractères, c'est juste une façon d'interpréter les données binaires : tu sais que c'est un fichier texte, donc tu traites le contenu comme du texte
Très bien,donc qu'est ce qui traduit les données binaire sur disque en données texte à l'affichage.
Quel est l'utilitaire qui s'en charge.
Je te remercie de ta réponse.
Cordialement.
new_wave
contenu d'un objet de type FileStream
Je te remercie de tes réponses.
tout est plus clair à présent.
Puisqu' un objet de type BinaryReader permet de lire les données contenues dans un objet de type Stream, il est nécessaire donc qu'auparavant ces données aient été écrites dans cet objet de type Stream par un objet de type BinaryWriter.
Est-ce exact?
Si les données de départ sont contenues dans un fichier de type .bin est-il alors nécessaire qu'un objet de type BinaryWriter écrive ces données dans l'objet de type Stream pour que l'objet de type BinaryReader puisse les lire?
Te remerciant encore de ta réponse.
Bien cordialement.
New_wave
contenu d'un objet de type FileStream
Bonjour et merci de ta réponse
J'aimerais revenir sur le fait que tu écrives qu'un Stream ne contient rien.
Pour ce que j'en sais, un objet de type FileStream contient un flux binaire.
C'est en quelque sorte un curseur qui contient les données d'un fichier sous forme binaire.
J'aimerais que nous soyons ok là dessus, sinon, je vais m'embrouiller un peu plus...
Ensuite, quand j'écris cette portion de code
Code:
1 2 3 4 5 6
|
string sourceFilePath =@"C:\Users\Student\Documents\BinaryDataFile.bin";
FileStream sourceFile = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(sourceFile); |
Quelle est l'instruction qui permet que les données du fichier BinaryDatafile.bin se retrouvent dans la variable sourceFile de type FileStream?
Est-ce que du fait de cette instruction
Code:
1 2
|
FileStream sourceFile = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read); |
Ou est-ce que les données du fichier BinaryDataFile.bin se retrouvent automatiquement dans le flux binaire sourceFile
Merci encore beaucoup de ta réponse et de tout le temps que tu consacres à bien vouloir me répondre.
Cordialement.
new_wave
contenu d'un objet de type FileStream
Merci encore pour toutes ces précisions.
Lorsque tu écris l'instruction
Code:
1 2 3
|
FileStream sourceFile = new FileStream(sourceFilePath, FileMode.Create, FileAccess.Write); |
puis, à l afin du programme
Tu fermes bien l'objet sourcefile de type FileStream.
Suite à cette fermeture, les données qu'il "contient"(entre guillemets" puisque tu n'acceptes pas ce terme)sont bien flushées vers le ficher système concerné par l'écriture.
Ne peut-on pas dire donc que sourceFile "contient des données , même si c'est via un buffer.
Par ailleurs, quelle est la différence exacte entre un objet de type BinaryReader et un objet de type StreamReader.
Est-ce lié à la quantité de données que chacun peut lire?
Pour finir, quandf j'écris l'instruction
Code:
1 2
|
fileContents.Append((char)reader.Read()); |
La conversion en char est-elle la seule unique.
D'après moi oui car on convertit par cette conversion la valeur binaire d'un caractère(valeur ASCII) en caractère
Merci encore beaucoup de bien vouloir m'aider à préciser toutes ces notions.
Cordialement.
new_wave
contenu d'un objet de type FileStream
Bonjour et merci de ta réponse.
C'est très bien, je suis rassurée quant à la définition que j'avais d'une variable de type FileStream.
Tu expliques que la différence entre un StreamReader et un BinaryReader est que StreamReader permet, à partir d'un flux binaire brut (Stream), de lire du texte selon un encodage donné (UTF-8, ISO-8859-1, etc) alors que BinaryReader, permet, à partir d'un flux binaire brut (Stream), de lire des valeurs de type primitif, comme int, double, DateTime, etc
Bien, soit les deux exemples suivants, le premier pour l'usage d'un BinaryReader, le second pour celui d'un StreamReader
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
string sourceFilePath = @"C:\Users\pieces_labiche.txt ";
FileStream sourceFile = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(sourceFile);
//on stocke la position courante dans le stream
int position = 0;
//on stocke la la longueur du flux(stream)
int length = (int)reader.BaseStream.Length;
MessageBox.Show("la longueur du texte a une valeur de" + length);
//on crée un tableau DataCollection pour stocker chaque caractère du fichier
char[] DataCollection = new char[length];
//permet de stocker le byte courant
int returnedByte = 0;
while ((returnedByte = reader.Read()) != -1)
{
DataCollection[position] = (char)returnedByte;
MessageBox.Show("la valeur du char courant dans DataCollection est " + DataCollection[position]);
position += sizeof(byte);
}//fin de while
//on ferme les flux pour libérer toute gestion de fichier
reader.Close();
sourceFile.Close();*/ |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
string sourceFilePath = @"C:\Users\har@43\Documents\livres_achat.txt";
FileStream sourceFile = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(sourceFile);
StringBuilder fileContents = new StringBuilder();
while (reader.Peek() != -1)
{
fileContents.Append((char)reader.Read());
fileContents.Append((char)reader.Read());
}
string Data = fileContents.ToString();
reader.Close();
sourceFile.Close(); |
Que ce soit avec l'objet de type BinaryReader ou celui de type StreamReader je récupère des données binaires provenant d'un fichier .txt; la méthode Read permet de récupérer la valeur entière de chaque caractère selon la table ASCII.
Puis ensuite je peux convertir cette valeur en caractère de type char.
Où est alors la différence entre les deux objets.
Te remerciant beaucoup de ton aide sur ce point.
Cordialement.
new_wave
contenu d'un objet de type FileStream
Merci encore de ta réponse.
Pour ce qui est des méthodes ReadLine() et ReadtoEnd() de la la classe StreamReader, elles retournent directement un String.
Normalement, la lecture s'applique à des données binaires; peut-on en déduire qu'il y a eu une conversion en string(ou en char plusieurs fois) qui s'est appliquée mais qui est complètement transparente pour nous, pour qu'au final ce soit un string qui soit retourné et pas un int , comme pour la méthode Read().
Je te remercie beaucoup de, tes réponses.
Une fois ta dernière réponse reçue, je considèrerai que le sujet est résolu.
Bien cordialement.
new_wave
contenu d'un objet de type fileStream
Bonjour,
Je considère que le sujet est résolu.
Merci encore beaucoup de toute votre aide et de tout le temps que vous avez bien voulu consacrer à me répondre.
Cordialement.
new_wave