Wanneer een FileStream-object met leesmogelijkheden (een object waarbij de parameter
fileMode
van de methode
open()
of
openAsync()
is ingesteld op
READ
of
UPDATE
) wordt geopend, slaat de runtime de gegevens op in een interne buffer. Het FileStream-object begint gegevens in de buffer in te lezen zodra u het bestand opent (door de methode
open()
of
openAsync()
van het FileStream-object op te roepen).
Voor een bestand dat is geopend voor synchrone bewerkingen (met behulp van de methode
open()
), kunt u de aanwijzer
position
altijd instellen op een willekeurige geldige positie (binnen de grenzen van het bestand) en beginnen met het inlezen van een willekeurige hoeveelheid gegevens (binnen de grenzen van het bestand), zoals aangegeven in de volgende code (waarbij ervan wordt uitgegaan dat het bestand minimaal 100 bytes omvat):
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);
Of een bestand nu wordt geopend voor synchrone dan wel asynchrone bewerkingen, de leesmethode leest altijd uit de "beschikbare" bytes (vertegenwoordigd door de eigenschap
bytesAvalable
). Als synchroon wordt gelezen, zijn alle bytes van het bestand op elk willekeurig moment beschikbaar. Als asynchroon wordt gelezen, worden de bytes beschikbaar gesteld vanaf de positie die wordt aangegeven door de eigenschap
position
terwijl de buffer op asynchrone wijze steeds verder wordt gevuld (gesignaleerd door
progress
-gebeurtenissen).
Voor bestanden die zijn geopend voor
synchrone
bewerkingen wordt de eigenschap
bytesAvailable
altijd zo ingesteld dat deze het aantal bytes vanaf de eigenschap
position
tot het einde van het bestand vertegenwoordigt (alle bytes in het bestand zijn altijd beschikbaar voor lezen).
Voor bestanden die zijn geopend voor
asynchrone
bewerkingen moet u ervoor zorgen dat de leesbuffer voldoende gegevens heeft verbruikt voordat een leesmethode wordt opgeroepen. Voor een bestand dat asynchroon is geopend, geldt dat naarmate de leesbewerking vordert, de gegevens uit het bestand aan de buffer worden toegevoegd, beginnende bij de waarde van
position
die werd opgegeven toen de leesbewerking werd gestart. De waarde van de eigenschap
bytesAvailable
wordt verhoogd met iedere byte die wordt gelezen. De eigenschap
bytesAvailable
geeft het aantal bytes aan dat beschikbaar is, vanaf de byte die zich bevindt op de positie die wordt aangegeven door de eigenschap
position
tot het einde van de buffer. Het FileStream-object verzendt regelmatig de gebeurtenis
progress
.
Voor een bestand dat asynchroon is geopend, verzendt het FileStream-object periodiek de gebeurtenis
progress
naarmate gegevens beschikbaar worden in de leesbuffer. De volgende code leest bijvoorbeeld gegevens in een ByteArray-object (
bytes
) terwijl dit in de buffer wordt ingelezen:
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);
}
Voor een bestand dat asynchroon is geopend, kunnen alleen de gegevens in de leesbuffer worden gelezen. Terwijl u de gegevens leest, worden ze verwijderd uit de leesbuffer. Voor leesbewerkingen moet u ervoor zorgen dat de gegevens aanwezig zijn in de leesbuffer voordat u de leesbewerking oproept. De volgende code leest bijvoorbeeld 8000 bytes aan gegevens vanaf positie 4000 in het bestand:
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");
}
}
Tijdens een schrijfbewerking leest het FileStream-object geen gegevens in de leesbuffer. Wanneer een schrijfbewerking wordt voltooid (alle gegevens in de schrijfbuffer zijn naar het bestand geschreven), start het FileStream-object een nieuwe leesbuffer (ervan uitgaande dat het gekoppelde FileStream-object is geopend met leescapaciteiten) en begint het gegevens in de leesbuffer in te lezen, beginnende bij de positie die wordt aangegeven door de eigenschap
position
. De eigenschap
position
kan de positie aangeven van de byte die het laatst is geschreven, of een andere positie als de gebruiker een andere waarde voor het
position
-object na de schrijfbewerking heeft opgegeven.