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.