Der Lesepuffer und die bytesAvailable-Eigenschaft

Adobe AIR 1.0 und höher

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.