Búfer de lectura y propiedad bytesAvailable de un objeto FileStream

Adobe AIR 1.0 y posterior

Cuando se abre un objeto FileStream con capacidad de lectura (uno en que el parámetro fileMode del método open() o openAsync() se definió en READ o UPDATE ), el motor de ejecución guarda los datos en un búfer interno. El objeto FileStream empieza a leer datos en el búfer en cuanto se abre el archivo (llamando al método open() o openAsync() del objeto FileStream).

Si es un archivo que se abrió para realizar operaciones sincrónicas (con el método open() ), siempre se puede configurar el puntero position en cualquier posición (dentro de los límites del archivo) y empezar a leer cualquier cantidad de datos (dentro de los límites del archivo), como se ilustra en el siguiente código, que presupone que el archivo contiene por lo menos 100 bytes):

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);   

Se abra el archivo para operaciones sincrónicas o para operaciones asíncronas, los métodos de lectura siempre leen desde los bytes "disponibles", representados por la propiedad bytesAvailable . Al leer de forma sincrónica, todos los bytes del archivo están disponibles todo el tiempo. Al leer de forma asíncrona, los bytes quedan disponibles a partir de la posición especificada por la propiedad position en una serie de llenados de búfer asíncronos señalados por los eventos progress .

Para archivos que se abren para realizar operaciones sincrónicas , la propiedad bytesAvailable se define siempre de modo que represente la cantidad de bytes desde la propiedad position hasta el final del archivo (para fines de lectura, siempre están disponibles todos los bytes del archivo).

En el caso de archivos abiertos para realizar operaciones asíncronas , hay que asegurarse de que el búfer de lectura haya consumido suficientes datos antes de llamar a un método de lectura. Para un archivo abierto de forma asíncrona, a medida que avanza la operación de lectura se van añadiendo al búfer los datos del archivo -empezando por el valor especificado para position cuando se inició la operación de lectura- y la propiedad bytesAvailable se incrementa con cada byte que se lee. La propiedad bytesAvailable indica la cantidad de bytes que hay disponibles desde el byte de la posición especificada por la propiedad position y el final del búfer. El objeto FileStream envía periódicamente un evento progress .

Para un archivo abierto de forma asíncrona, a medida que los datos quedan disponibles en el búfer de lectura el objeto FileStream distribuye periódicamente el evento progress . Por ejemplo, el siguiente código lee datos en un objeto ByteArray, bytes , a medida que se van leyendo los mismos para ponerlos en el búfer.

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); 
} 

Para un archivo abierto de forma asíncrona, solo se pueden leer los datos que se encuentran en el búfer de lectura. Además, a medida que el usuario lee los datos, estos se eliminan del búfer de lectura. Para las operaciones de lectura hay que asegurarse de que los datos existan en el búfer de lectura antes de llamar a la operación de lectura. En el siguiente ejemplo el código lee 8.000 bytes de datos empezando por la posición 4.000 del archivo:

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"); 
    } 
} 

Durante una operación de escritura, el objeto FileStream no lee datos para ponerlos en el búfer de lectura. Cuando finaliza una operación de escritura (todos los datos en el búfer de escritura se han escrito en el archivo), el objeto FileStream inicia un nuevo búfer de lectura (suponiendo que el objeto FileStream asociado se abrió con capacidad de lectura) y empieza a leer datos para ponerlos en el búfer de lectura, comenzando por la posición especificada por la propiedad position . La propiedad position puede ser la posición del último byte escrito, o puede ser otra posición si el usuario especifica otro valor para el objeto position después de la operación de escritura.