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.