При открытии объекта 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
после операции записи.