O buffer de leitura e a propriedade bytesAvailable do objeto FileStream

Adobe AIR 1.0 e posterior

Quando o objeto FileStream com recursos de leitura (em que o parâmetro fileMode do método open() ou openAsync() foi definido como READ ou UPDATE ) for aberto, o tempo de execução armazena os dados em um buffer interno. O objeto FileStream começa a fazer a leitura de dados no buffer assim que o arquivo for aberto (chamando o método open() ou openAsync() do objeto FileStream).

Em um arquivo aberto para operações síncronas (usando o método open() ), você sempre poderá definir o ponteiro position em qualquer posição válida (dentro dos limites do arquivo) e iniciar a leitura de qualquer quantidade de dados (dentro dos limites do arquivo), conforme mostra o código a seguir (que supõe que o arquivo contém pelo 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);   

Quer o arquivo seja aberto para operações síncronas ou assíncronas, os métodos de leitura sempre fazem a leitura dos bytes "disponíveis", representados pela propriedade bytesAvalable . Ao fazer a leitura sincronicamente, todos os bytes do arquivo ficam disponíveis o tempo todo. Ao fazer a leitura assincronicamente, os bytes se tornam disponíveis, iniciando na posição especificada pela propriedade position , em uma série de preenchimentos de buffer assíncronos assinalados por eventos progress .

Em arquivos abertos para operações síncronas , a propriedade bytesAvailable é sempre definida para representar o número de bytes da propriedade position no final do arquivo (todos os bytes no arquivo estarão sempre disponíveis para leitura).

Em arquivos abertos para operações assíncronas , é necessário assegurar que o buffer de leitura consumiu dados suficientes antes de chamar o método de leitura. Em um arquivo aberto assincronicamente, conforme o andamento da operação de leitura, os dados do arquivo, iniciando na posição especificada quando a operação de leitura iniciou, são adicionados ao buffer, e a propriedade bytesAvailable é incrementada com cada byte lido. A propriedade bytesAvailable indica o número de bytes disponíveis, iniciando com o byte na posição especificada pela propriedade position até o final do buffer. Periodicamente, o objeto FileStream envia um evento progress .

Em um arquivo aberto sincronicamente, à medida que os dados se tornam disponíveis no buffer de leitura, o objeto FileStream despacha periodicamente o evento progress . Por exemplo, o código a seguir lê dados em um objeto ByteArray, bytes , conforme é lido no buffer:

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

Em um arquivo aberto assincronicamente, apenas os dados no buffer de leitura podem ser lidos. Além disso, conforme você lê os dados, eles são removidos do buffer de leitura. Em operações de leitura você precisa assegurar que haja dados no buffer de leitura antes de chamar uma operação de leitura. Por exemplo, o código a seguir faz a leitura de 8000 bytes de dados iniciando da posição 4000 no arquivo:

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 a operação de gravação, o objeto FileStream não faz a leitura de dados no buffer de leitura. Quando a operação de gravação estiver concluída (todos os dados no buffer de gravação são gravados no arquivo), o objeto FileStream inicia um novo buffer de leitura (supondo que o objeto FileStream associado foi aberto com recursos de leitura) e inicia a leitura de dados no buffer de leitura, começando da posição especificada pela propriedade position . A propriedade position pode ser a posição do último byte gravado ou pode ser uma posição diferente, se o usuário especificar um valor diferente para o objeto position após a operação de gravação.