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.