Właściwość
position
obiektu FileStream określa, czy dane są odczytywane lub zapisywane przez następną metodę odczytu lub zapisu.
Przed wykonaniem operacji odczytu lub zapisu należy ustawić właściwość
position
na poprawną pozycję w pliku.
Przykład: poniższy kod zapisuje ciąg znaków
"hello"
(kodowanie UTF) w pozycji 8 w pliku:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 8;
myFileStream.writeUTFBytes("hello");
Przy pierwszym otwarciu obiektu FileStream dla właściwości
position
ustawiona zostaje wartość 0.
Przed operacją odczytu wartość
position
musi wynosić co najmniej 0 i musi być mniejsza niż liczba bajtów w pliku (bajty są istniejącymi pozycjami w pliku).
Wartość właściwości
position
jest modyfikowana w następujących warunkach:
-
Po jawnym ustawieniu właściwości
position
.
-
Po wywołaniu metody read.
-
Po wywołaniu metody write.
Po wywołaniu metody read lub write obiektu FileStream właściwość
position
jest natychmiast zwiększana o liczbę bajtów odczytywanych lub zapisywanych. W zależności od tego, która metoda read jest używana, właściwość
position
jest zwiększana o liczbę bajtów określonych do odczytu lub o liczbę bajtów dostępnych. Jeśli następie zostanie wywołana metoda read lub write, metoda wykona operację odczytu lub zapisu począwszy od nowej pozycji.
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
trace(myFileStream.position); // 4200
Istnieje jednak jeden wyjątek: w przypadku obiektu FileStream otwartego w trybie append właściwość
position
nie jest zmieniana po wywołaniu metody write. (W trybie append dane są zawsze zapisywane na końcu pliku niezależnie od wartości właściwości
position
).
W przypadku pliku otwartego dla operacji asynchronicznych operacja write nie kończy działania przed wykonaniem kolejnego wiersza kodu. Jednak możliwe jest wywołanie kolejno wielu metod asynchronicznych, a wówczas środowisko wykonawcze wykonuje je w określonej kolejności:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.WRITE);
myFileStream.writeUTFBytes("hello");
myFileStream.writeUTFBytes("world");
myFileStream.addEventListener(Event.CLOSE, closeHandler);
myFileStream.close();
trace("started.");
closeHandler(event:Event):void
{
trace("finished.");
}
Wynik (trace (output)) dla tego kodu jest następujący:
started.
finished.
Możliwe
jest określenie wartości
position
bezpośrednio po wywołaniu metody read lub call (lub w dowolnym czasie), a wówczas następna operacja odczytu lub zapisu odbywa się od tej pozycji. Przykład: poniższy kod ustawia właściwość
position
po wywołaniu operacji
writeBytes()
, a dla parametru
position
ustawiana jest ta wartość (300) nawet po zakończeniu operacji write:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
myFileStream.position = 300;
trace(myFileStream.position); // 300