Свойство
position
объекта FileStream определяет, откуда считываются и куда записываются данные при вызове следующего метода чтения или записи.
Перед операцией чтения или записи свойство
position
необходимо задать любому действительному месту в файле.
Например, в приведенном ниже коде строка
"hello"
(в кодировке UTF) находится в файле в положении 8:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 8;
myFileStream.writeUTFBytes("hello");
При первом открытии объекта FileStream свойство
position
имеет значение 0.
Перед операцией чтения значение
position
должно быть не менее 0 и не более числа байтов в файле (они определяют имеющиеся позиции в файле).
Значение свойства
position
изменяется только при следующих условиях:
-
если свойство
position
задается явно.
-
если вызывается метод чтения.
-
если вызывается метод записи.
Если вызывается метод чтения или записи объекта FileStream, к свойству
position
немедленно прибавляется количество записанных или считанных байтов. В зависимости от используемого метода чтения или записи, значение свойства
position
увеличивается на заданное количество считываемых байтов или на количество свободных байтов. При последовательном вызове метода чтения или записи эта операция начинается с новой позиции.
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.open(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
trace(myFileStream.position); // 4200
Тем не менее существует и исключение: если объект FileStream открыт в режиме добавления данных, свойство
position
не изменяется после вызова метода чтения или записи. (В режиме добавления данные всегда записываются в конец файла, вне зависимости от значения свойства
position
.)
Если файл открыт для асинхронных операций, операция записи не завершится, пока не будет выполнена следующая строка кода. Однако при вызове нескольких асинхронных методов подряд среда выполнения будет выполнять их по очереди:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.WRITE);
myFileStream.writeUTFBytes("hello");
myFileStream.writeUTFBytes("world");
myFileStream.addEventListener(Event.CLOSE, closeHandler);
myFileStream.close();
trace("started.");
closeHandler(event:Event):void
{
trace("finished.");
}
Вот как выглядит пошаговое выполнение этого кода:
started.
finished.
Значение свойства
position
может быть задано
сразу после вызова метода чтения или записи (или в любое время), и тогда следующая операция чтения или записи начнется из этого положения. Например, обратите внимание, что в приведенном ниже коде свойство
position
задается сразу после вызова операции
writeBytes()
, а значение свойства
position
остается равным 300 даже после завершения операции записи:
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.openAsync(myFile, FileMode.UPDATE);
myFileStream.position = 4000;
trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
myFileStream.position = 300;
trace(myFileStream.position); // 300