Läsbufferten och egenskapen bytesAvailable för ett FileStream-objekt

Adobe AIR 1.0 och senare

När ett FileStream-objekt med läsfunktioner (ett med parametern fileMode för metoden open() eller openAsync() inställd på READ eller UPDATE ) öppnas lagrar körningsversionen data i en intern buffert. FileStream-objektet börjar att läsa data till bufferten så snart du öppnar filen (genom att anropa metoden open() eller openAsync() för FileStream-objektet).

För en fil som öppnas för synkrona åtgärder (med metoden open() ) kan du alltid ställa in pekaren position till en giltig position (inom filens gränser) och börja läsa valfri datamängd (inom filens gränser), vilket visas i koden nedan (som förutsätter att filen innehåller minst 100 byte):

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);   

Oavsett om filen öppnas för synkrona eller asynkrona åtgärder läser read-metoderna alltid från ”tillgängliga” byte, som representeras av egenskapen bytesAvalable . När du läser synkront är alla byte i filen tillgängliga hela tiden. När du läser asynkront blir dessa byte tillgängliga vid den position som anges med egenskapen position , i en serie med asynkrona buffertfyllningar som signaleras med progress -händelser.

För filer som öppnas för synkrona åtgärder, ställs egenskapen bytesAvailable alltid in så att den representerar antalet byte från egenskapen position till slutet på filen (alla byte i filen är alltid tillgängliga för läsning).

För filer som öppnas för asynkrona åtgärder måste du se till att läsbufferten har förbrukat tillräckligt med data innan du anropar en read-metod. För en fil som öppnas synkront läggs data från filen till i bufferten allt eftersom read-åtgärden fortlöper, med början vid den position som anges när read-åtgärden startar, och egenskapen bytesAvailable ökar med varje byte som läses. Egenskapen bytesAvailable anger antalet tillgängliga byte med början vid den position som anges med egenskapen position till slutet på bufferten. FileStream-objektet skickar regelbundet en progress -händelse.

För en fil som öppnas asynkront skickar FileStream-objektet regelbundet progress -händelsen allt eftersom data blir tillgängliga i läsbufferten. Följande kod läser data till ett ByteArray-objekt, bytes , allt eftersom den läser till bufferten:

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); 
} 

För en fil som öppnas asynkront kan bara data i läsbufferten läsas. Allt eftersom du läser data, tas de bort från läsbufferten. För read-åtgärder måste du se till att det finns data i läsbufferten innan du anropar read-åtgärden. Följande kod läser 8 000 byte med data från position 4 000 i filen:

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"); 
    } 
} 

Under en write-åtgärd läser inte FileStream-objektet några data till läsbufferten. När en write-åtgärd är klar (alla data i skrivbufferten har skrivits till filen) startar FileStream-objektet en ny läsbuffert (förutsatt att det tillhörande FileStream-objektet öppnades med läsfunktioner), och börjar läsa data till läsbufferten med början vid den position som anges med egenskapen position . Egenskapen position kan vara positionen för den sista byten som skrivs, eller vara en annan position om användaren anger ett annat värde för position -objektet efter write-åtgärden.