Buffer di lettura e proprietà bytesAvailable di un oggetto FileStream

Adobe AIR 1.0 e versioni successive

Quando si apre un oggetto FileStream con funzionalità di lettura (una in cui il parametro fileMode del metodo open() o openAsync() è stato impostato su READ o UPDATE ), il runtime memorizza i dati in un buffer interno. L'oggetto FileStream inizia la lettura dei dati nel buffer non appena si apre il file (chiamando il metodo open() o openAsync() dell'oggetto FileStream).

Per un file aperto per operazioni sincrone (tramite il metodo open() ), è possibile impostare sempre il puntatore position a una qualsiasi posizione valida (entro i limiti del file) e iniziare la lettura di una qualsiasi quantità di dati (entro i limiti del file) come illustrato nel codice seguente (il quale ipotizza che il file contenga almeno 100 byte):

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 un file viene aperto per operazioni sincrone o asincrone, i metodi di lettura leggono sempre dai byte "disponibili", rappresentati dalla proprietà bytesAvalable . Durante la lettura in modo sincrono, tutti i byte del file sono sempre disponibili. Durante la lettura in modo asincrono, i byte diventano disponibili a partire dalla posizione specificata dalla proprietà position in una serie di riempimenti buffer segnalati da eventi progress .

Per file aperti per operazioni sincrone , la proprietà bytesAvailable è sempre impostata per rappresentare il numero di byte dalla proprietà position fino alla fine del file (tutti i byte nel file sono sempre disponibili per la lettura).

Per file aperti per operazioni asincrone , è necessario garantire che il buffer di lettura abbia utilizzato un numero sufficiente di dati prima della chiamata di un metodo di lettura. Per un file aperto in modo asincrono, con l'avanzamento dell'operazione di lettura, i dati del file vengono aggiunti al buffer a partire dalla position specificata all'inizio dell'operazione di lettura e la proprietà bytesAvailable aumenta con la lettura di ciascun byte. La proprietà bytesAvailable indica il numero di byte disponibili partendo con il byte nella posizione specificata dalla posizione position alla fine del buffer. Periodicamente l'oggetto FileStream invia un evento progress .

Per un file aperto in modo asincrono, quando i dati vengono resi disponibili nel buffer di lettura, l'oggetto FileStream invia periodicamente l'evento progress . Ad esempio, il codice seguente legge i dati in un oggetto ByteArray, bytes , mentre legge nel 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); 
} 

Per un file aperto in modo asincrono, solo i dati nel buffer di lettura possono essere letti. Inoltre, mentre si leggono i dati, questi vengono rimossi dal buffer di lettura. Per le operazioni di lettura, è necessario garantire che i dati siano presenti nel buffer di lettura prima di chiamare tale operazione. Ad esempio, il codice seguente legge 8000 byte di dati a partire dalla posizione 4000 nel file:

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 un'operazione di scrittura, l'oggetto FileStream non legge dati nel buffer di lettura. Al termine di un'operazione di scrittura (tutti i dati nel buffer di scrittura vengono scritti nel file), l'oggetto FileStream inizia un nuovo buffer di lettura (supponendo che l'oggetto FileStream associato sia stato aperto con funzionalità di lettura) e inizia la lettura dei dati nel buffer di lettura, a partire dalla posizione specificata dalla proprietà position . La proprietà position può corrispondere alla posizione dell'ultimo byte scritto oppure a una posizione differente, nel caso l'utente specifichi un valore differente per l'oggetto position dopo l'operazione di scrittura.