Bufor odczytu oraz właściwość bytesAvailable obiektu FileStream

Adobe AIR 1.0 i wersje późniejsze

Po otwarciu obiektu FileStream z funkcją odczytu (taki, w którym dla parametru fileMode metody open() lub openAsync() ustawiono wartość READ lub UPDATE) środowisko wykonywania przechowuje dane w buforze wewnętrznym. Obiekt FileStream rozpoczyna wczytywanie danych do buforu po otwarciu pliku (poprzez wywołanie metody open() lub openAsync() obiektu FileStream).

W przypadku pliku otwartego dla operacji synchronicznych (za pomocą metody open()) zawsze można ustawić wskaźnik position na dowolną poprawną metodę (w granicach pliku), a następnie rozpocząć odczyt dowolnej ilości danych (w granicach pliku), co przedstawia poniższy kod (w którym założono, że plik zawiera co najmniej 100 bajtów danych):

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

Niezależnie od tego, czy plik jest otwarty dla operacji synchronicznych, czy asynchronicznych, metoda read zawsze odczytuje z bajtów „dostępnych” reprezentowanych przez właściwość bytesAvalable. W przypadku odczytu synchronicznego wszystkie bajty pliku są dostępne przez cały czas. W przypadku odczytu asynchronicznego bajty stają się dostępne począwszy od pozycji określonej przez właściwość position — w seriach asynchronicznego wypełniania buforu, o czym powiadamiają zdarzenia progress.

W przypadku plików otwartych dla operacji synchronicznych właściwość bytesAvailable jest zawsze ustawiona w taki sposób, aby reprezentowała liczbę bajtów od właściwości position do końca pliku (wszystkie bajty pliku są przez cały czas dostępne do odczytu).

W przypadku plików otwartych dla operacji asynchronicznych przed wywołaniem metody read należy upewnić się, że bufor odczytu zawiera dostateczną ilość danych. W przypadku pliku otwartego asynchronicznie, w miarę postępu operacji odczytu, dane z pliku — począwszy od pozycji position określonej przy uruchamianiu operacji odczytu — są dodawane do buforu, a wartość właściwości bytesAvailable wzrasta z każdym odczytanym bajtem. Właściwość bytesAvailable wskazuje liczbę dostępnych bajtów począwszy od pozycji określonej przez właściwość position do końca buforu. Co pewien czas obiekt FileStream wysyła zdarzenie progress.

W przypadku pliku otwartego asynchronicznie — w miarę udostępniania danych w buforze odczytu — obiekt FileStream co pewien czas wywołuje zdarzenie progress. Na przykład: poniższy kod wczytuje dane do obiektu ByteArray, bytes, w miarę wczytywania danych do buforu:

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

W przypadku pliku otwartego asynchronicznie możliwy jest tylko odczyt danych z buforu odczytu. Ponadto w miarę odczytu dane są usuwane z buforu odczytu. Przed wywołaniem operacji odczytu należy się upewnić, że dane istnieją w buforze odczytu. Przykład: poniższy kod odczytuje 8000 bajtów danych począwszy od pozycji 4000 w pliku:

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

Podczas operacji odczytu obiekt FileStream nie wczytuje danych do buforu odczytu. Po zakończeniu operacji zapisu (wszystkie dane z buforu zapisu zostają zapisane do pliku) obiekt FileStream uruchamia nowy bufor odczytu (przy założeniu, że skojarzony obiekt FileStream został otwarty z funkcjami odczytu), a następnie rozpoczyna wczytywanie danych do buforu odczytu, począwszy od pozycji określonej przez właściwość position. Właściwość position może określać pozycję ostatniego zapisanego bajtu lub może to być inna pozycja, jeśli użytkownik określił inną wartość dla obiektu position po operacji zapisu.