Mémoire tampon de lecture et propriété bytesAvailable d’un objet FileStream

Adobe AIR 1.0 et les versions ultérieures

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.