A propriedade position do objeto FileStream

Adobe AIR 1.0 e posterior

A propriedade position do objeto FileStream determina quando os dados são lidos ou gravados no próximo método de leitura ou gravação.

Antes de uma operação de leitura ou gravação, defina a propriedade position como qualquer posição válida no arquivo.

Por exemplo, o código a seguir grava a sequência "hello" (na codificação UTF) na posição 8 do arquivo:

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.open(myFile, FileMode.UPDATE); 
myFileStream.position = 8; 
myFileStream.writeUTFBytes("hello");  

Quando você abre pela primeira vez o objeto FileStream, a propriedade position é definida como 0.

Antes de uma operação de leitura, o valor de position deve ser no mínimo 0 e inferior ao número de bytes no arquivo (que são posições existentes no arquivo).

O valor da propriedade position é modificado apenas nas seguintes condições:

  • Quando você define explicitamente a propriedade position .

  • Quando você chama o método de leitura.

  • Quando você chama o método de gravação.

Quando você chama um método de leitura ou gravação do objeto FileStream, a propriedade position é imediatamente incrementada pelo número de bytes que você lê ou grava. Dependendo do método de leitura usado, a propriedade position também é incrementada pelo número de bytes especificado para leitura ou pelo número de bytes disponível. Quando você chama o método de leitura ou gravação subsequentemente, ele faz a leitura ou gravação iniciando na nova posição.

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.open(myFile, FileMode.UPDATE); 
myFileStream.position = 4000;  
trace(myFileStream.position); // 4000 
myFileStream.writeBytes(myByteArray, 0, 200); 
trace(myFileStream.position); // 4200          

Há, porém, uma exceção: em um FileStream aberto no modo append, a propriedade position não é alterada após uma chamada de um método de gravação. (No modo append, os dados são sempre gravados no final do arquivo, independentemente do valor da propriedade position .)

Em um arquivo aberto para operações assíncronas, a operação de gravação não é concluída antes de a próxima linha de código ser executada. No entanto, você pode chamar vários métodos assíncronos sequencialmente e o tempo de execução os executa em ordem:

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.openAsync(myFile, FileMode.WRITE); 
myFileStream.writeUTFBytes("hello"); 
myFileStream.writeUTFBytes("world"); 
myFileStream.addEventListener(Event.CLOSE, closeHandler); 
myFileStream.close(); 
trace("started."); 
 
closeHandler(event:Event):void  
{ 
    trace("finished."); 
}

A saída trace desse código é a seguinte:

started. 
finished.

Você pode especificar o valor position logo após chamar um método de leitura ou gravação (ou a qualquer momento) e a próxima operação de leitura ou gravação ocorrerá no início dessa posição. Por exemplo, observe que o código a seguir define a propriedade position logo após uma chamada para a operação writeBytes() e a position é definida como esse valor (300) mesmo após a operação de gravação ser concluída:

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.openAsync(myFile, FileMode.UPDATE); 
myFileStream.position = 4000; 
trace(myFileStream.position); // 4000 
myFileStream.writeBytes(myByteArray, 0, 200); 
myFileStream.position = 300; 
trace(myFileStream.position); // 300