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

Adobe AIR 1.0 i starsze wersje

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.