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.