Quando um arquivo for aberto de modo assíncrono (usando o método
openAsync()
), os arquivos de leitura e gravação serão executados de modo assíncrono. À medida que os dados são lidos no buffer de leitura e os dados de saída começam a ser gravados, outro código ActionScript pode ser executado.
Isso significa que é necessário se registrar para eventos gerados pelo objeto FileStream abertos de modo assíncrono.
Registrando-se para o evento
progress
, você poderá ser notificado quando novos dados se tornarem disponíveis para leitura, como no seguinte código:
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);
var str:String = "";
function progressHandler(event:ProgressEvent):void
{
str += myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}
Você pode fazer a leitura de todos os dados se registrando para o evento
complete
, como no seguinte código:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(myFile, FileMode.READ);
var str:String = "";
function completeHandler(event:Event):void
{
str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}
Da mesma maneira que os dados de entrada são colocados em buffer para permitir a leitura assíncrona, os dados que você grava em um fluxo assíncrono são colocados em buffer e gravados no arquivo de forma assíncrona. À medida que os dados são gravados em um arquivo, o objeto FileStream despacha periodicamente o objeto
OutputProgressEvent
. O objeto
OutputProgressEvent
inclui a propriedade
bytesPending
definida pelo número de bytes restantes para gravação. Você pode registrar para que o evento
outputProgress
seja notificado, já que esse buffer é, na realidade, gravado no arquivo, talvez para exibir uma caixa de diálogo de progresso. No entanto, isso geralmente não é necessário. Especificamente, você pode chamar o método
close()
sem se importar com os bytes não gravados. O objeto FileStream continuará gravando dados e o evento
close
será entregue após o byte final ser gravado no arquivo e o arquivo subjacente ser fechado.