Буфер чтения и свойство bytesAvailable объекта FileStream

Adobe AIR 1.0 и более поздних версий

При открытии объекта FileStream с возможностью чтения (т. е. если параметр fileMode метода open() или openAsync() равен READ или UPDATE ) среда выполнения сохраняет данные во внутреннем буфере. Объект FileStream начинает чтение данных в буфер сразу же после открытия файла (вызывается метод open() или openAsync() объекта FileStream).

Если файл открыт для синхронных операций (с помощью метода open() ), указатель position можно установить на любое действительное положение (в границах файла) и начать чтение любого объема данных (в границах файла), как показано ниже (здесь мы исходим из того, что в файле не менее 100 байт):

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

Неважно, в каком режиме открыт файл: для синхронных или асинхронных операций, — методы чтения всегда обращаются к «доступным» байтам, представленным свойством bytesAvalable . При синхронном чтении все байты файла доступны постоянно. При асинхронном чтении байты становятся доступны, начиная с положения, указанного свойством position , в ряде асинхронно заполненных сегментов буфера, о чем сообщают события progress .

Если файл открыт для синхронных операций, свойство bytesAvailable всегда равно числу байтов от значения свойства position до конца файла (для чтения доступны все байты в файле).

Если файл открыт для асинхронных операций, то, прежде чем вызывать метод чтения, необходимо убедиться, что в буфере чтения достаточно данных. Если файл открыт асинхронно, то по мере выполнения операции чтения данные из файла (начиная со значения position , заданного в начале операции чтения) добавляются в буфер, а значение свойства bytesAvailable увеличивается по мере считывания байтов. Свойство bytesAvailable указывает количество доступных байтов, начиная с байта в положении, заданном свойством position , и до конца буфера. Объект FileStream периодически отправляет событие progress .

Если файл открыт асинхронно, то, по мере того как данные в буфере чтения становятся доступны, объект FileStream периодически отправляет событие progress . Например, в приведенном ниже коде данные считываются в объект ByteArray, bytes , по мере того как они считываются в буфер:

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

Если файл открыт асинхронно, считываться могут только данные в буфере чтения. Более того, по мере чтения данных, они удаляются из буфера чтения. Перед началом операции чтения необходимо удостовериться, что в буфере есть данные. Например, в приведенном ниже коде считываются 8000 байт, начиная с положения 4000:

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

Во время записи объект FileStream не считывает данные в буфер чтения. После завершения операции записи (когда все данные из буфера записи записаны в файл) объект FileStream открывает новый буфер чтения (если связанный объект FileStream был открыт для чтения) и начинает считывать в него данные, начиная с положения, заданного свойством position . Значение свойства position может быть последним записанным байтом или другим положением, если пользователь указывает иное значение для объекта position после операции записи.