Wenn ein FileStream-Objekt mit read-Eigenschaften (eines, in dem der Parameter
fileMode
der
open()
- oder
openAsync()
-Methode auf
READ
oder
UPDATE
gesetzt wurde) geöffnet wird, speichert die Laufzeitumgebung die Daten in einem internen Puffer. Das FileStream-Objekt beginnt, die Daten in den Puffer zu lesen, sobald Sie die Datei öffnen (durch Aufruf der
open()
- oder
openAsync()
-Methode des FileStream-Objekts).
Bei einer für synchrone Operationen (mithilfe der
open()
-Methode) geöffneten Datei können Sie den
position
-Zeiger auf jede beliebige Position (innerhalb der Dateigrenzen) setzen und eine beliebige Datenmenge (innerhalb der Dateigrenzen) lesen. Dies wird im folgenden Code (der voraussetzt, dass die Datei mindestens 100 Byte umfasst) veranschaulicht:
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);
Ob eine Datei nun für synchrone oder asynchrone Operationen geöffnet wird, die read-Methoden lesen immer aus den „verfügbaren Bytes“, die durch die Eigenschaft
bytesAvailable
dargestellt werden. Beim synchronen Lesen sind stets alle Byte einer Datei verfügbar. Beim asynchronen Lesen sind die Bytes ab der in der Eigenschaft
position
angegebenen Position verfügbar, in einer Reihe asynchroner durch
progress
-Ereignisse gemeldeter Pufferfüllungen.
Bei Dateien, die für
synchrone
Operationen geöffnet wurden, ist die Eigenschaft
bytesAvailable
immer gesetzt und repräsentiert die Anzahl der Bytes von der
position
-Eigenschaft bis zum Dateiende (alle Bytes in der Datei sind stets zum Lesen verfügbar).
Bei Dateien, die für
asynchrone
Operationen geöffnet wurden, müssen Sie sicherstellen, dass der Lesepuffer genügend Daten verbraucht hat, bevor Sie eine read-Methode aufrufen. Bei einer Datei, die asynchron geöffnet wird, während die read-Operation voranschreitet, werden die Daten aus der Datei ab der zu Beginn der read-Operation festgelegten
position
in den Puffer eingefügt, und die
bytesAvailable
-Eigenschaft wird mit jedem gelesenen Byte um eins hochgezählt. Die Eigenschaft
bytesAvailable
kennzeichnet die Anzahl verfügbarer Byte ab dem Byte an der durch die Eigenschaft
position
festgelegten Position bis zum Ende des Puffers. Das FileStream-Objekt sendet in regelmäßigen Abständen ein
progress
-Ereignis.
Bei einer asynchron geöffneten Datei löst das FileStream-Objekt in regelmäßigen Abständen das
progress
-Ereignis aus, während die Daten allmählich im Lesepuffer zur Verfügung gestellt werden. Der folgende Code beispielsweise liest Daten in das ByteArray-Objekt
bytes
ein, während es in den Puffer eingelesen wird:
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);
}
Bei einer asynchron geöffneten Datei können nur die in den Puffer eingelesenen Daten gelesen werden. Und während Sie die Daten lesen, werden Sie aus dem Lesepuffer entfernt. Bei read-Operationen müssen Sie sicherstellen, dass die Daten auch im Lesepuffer existieren, bevor Sie die read-Operation aufrufen. Der folgende Code etwa liest 8000 Byte Daten ab der Position 4000 in die Datei:
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");
}
}
Während einer write-Operation liest das FileStream-Objekt keine Daten in den Lespuffer. Wenn eine write-Operation abgeschlossen wird (d. h., alle Daten im write-Puffer in die Datei geschrieben wurden), startet das FileStream-Objekt einen neuen Lesepuffer (in der Annahme, dass das verbundene FileStream-Objekt mit Leserechten geöffnet wurde) und beginnt, die Daten in den Lesepuffer zu lesen, und zwar ab der durch die Eigenschaft
position
angegebenen Position. Die Eigenschaft
position
kann die Position des letzten gelesenen Bytes bezeichnen oder auch eine andere Position, wenn der Benutzer nach der write-Operation einen anderen Wert für das
position
-Objekt angibt.