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.