Lors de l’ouverture d’un objet FileStream doté de fonctionnalités de lecture (le paramètre
fileMode
de sa méthode
open()
ou
openAsync()
étant défini sur
READ
ou
UPDATE
), le moteur d’exécution stocke les données dans une mémoire tampon interne. L’objet FileStream commence la lecture et l’insertion des données dans la mémoire tampon dès l’ouverture du fichier (par appel de la méthode
open()
ou
openAsync()
de l’objet FileStream).
Si un fichier est ouvert en mode synchrone (à l’aide de la méthode
open()
), vous pouvez définir le pointeur
position
sur n’importe quelle position valide (dans les limites du fichier) et commencer à lire tout volume de données (dans les limites du fichier), comme l’illustre le code suivant (qui considère comme acquis que le fichier contient au moins 100 octets) :
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.READ);
myFileStream.position = 10;
myFileStream.readBytes(myByteArray, 0, 20);
myFileStream.position = 89;
myFileStream.readBytes(myByteArray, 0, 10);
Qu’un fichier soit ouvert en mode synchrone ou asynchrone, les méthodes de lecture lisent systématiquement les octets « disponibles », représentés par la propriété
bytesAvalable
. En mode de lecture synchrone, tous les octets du fichier sont disponibles en permanence. En mode asynchrone, les octets deviennent disponibles à partir de la position indiquée par la propriété
position
, dans une série de remplissages asynchrones de la mémoire tampon signalés par des événements
progress
.
En mode
synchrone
, la propriété
bytesAvailable
représente systématiquement le nombre d’octets compris entre la propriété
position
et la fin du fichier (tous les octets du fichier sont toujours disponibles pour la lecture).
En mode
asynchrone
, vous devez vous assurer que la mémoire tampon de lecture contient suffisamment de données avant d’appeler une méthode de lecture. Dans ce mode, au fur et à mesure de la lecture, les données du fichier sont ajoutées à la mémoire tampon, à partir de la
position
spécifiée au début de l’opération de lecture, et la propriété
bytesAvailable
est incrémentée à chaque octet lu. La propriété
bytesAvailable
indique le nombre d’octets disponibles entre l’octet situé à la position spécifiée par la propriété
position
et la fin de la mémoire tampon. L’objet FileStream envoie régulièrement un événement
progress
.
En mode asynchrone, l’objet FileStream distribue régulièrement l’événement
progress
à mesure que des données sont disponibles dans la mémoire tampon de lecture. Par exemple, le code suivant insère des données dans un objet ByteArray,
bytes
, au fur et à mesure de leur insertion dans la mémoire tampon de lecture :
var bytes:ByteArray = new ByteArray();
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.openAsync(myFile, FileMode.READ);
function progressHandler(event:ProgressEvent):void
{
myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
}
En mode asynchrone, seules les données que contient la mémoire tampon de lecture peuvent être lues. En outre, les données sont supprimées de la mémoire tampon au fur et à mesure de leur lecture. Avant d’appeler une opération de lecture, vous devez donc vous assurer que les données existent dans la mémoire tampon de lecture. Par exemple, le code suivant lit 8 000 octets de données à partir de la position 4 000 dans le fichier :
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(myFile, FileMode.READ);
myFileStream.position = 4000;
var str:String = "";
function progressHandler(event:Event):void
{
if (myFileStream.bytesAvailable > 8000 )
{
str += myFileStream.readMultiByte(8000, "iso-8859-1");
}
}
Lors d’une opération d’écriture, l’objet FileStream n’insère pas de données dans la mémoire tampon de lecture. Au terme de l’opération (toutes les données de la mémoire tampon d’écriture étant écrites dans le fichier), l’objet FileStream commence une nouvelle mémoire tampon de lecture (en supposant que l’objet FileStream ouvert associé possède des fonctionnalités de lecture) et commence à insérer des données dans la mémoire tampon de lecture à partir de la position spécifiée par la propriété
position
. La propriété
position
peut correspondre à la position du dernier octet écrit, mais elle est différente si l’utilisateur lui affecte une autre valeur après l’opération d’écriture.