FileStream 对象的
position
属性确定下一个读取或写入方法读取或写入数据的位置。
执行读取或写入操作之前,请将
position
属性设置为文件中的任何有效位置。
例如,以下代码在文件的位置 8 处写入字符串
"hello"
(采用 UTF 编码):
var myFile = air.File.documentsDirectory;
myFile = myFile.resolvePath("AIR Test/test.txt");
var myFileStream = new air.FileStream();
myFileStream.open(myFile, air.FileMode.UPDATE);
myFileStream.position = 8;
myFileStream.writeUTFBytes("hello");
当您首次打开 FileStream 对象时,
position
属性设置为 0。
执行读取操作之前,
position
的值必须至少为 0 并且小于文件中的字节数(即文件中的现有位置)。
只有在以下情况下才修改
position
属性的值:
-
当您明确设置
position
属性时。
-
当您调用读取方法时。
-
当您调用写入方法时。
当您调用 FileStream 对象的读取或写入方法时,
position
属性值立即增加您读取或写入的字节数。根据您使用的读取方法,
position
属性可以增加您指定读取的字节数,也可以增加可用的字节数。当您随后调用读取或写入方法时,它从新的位置开始读取或写入。
var myFile = air.File.documentsDirectory;
myFile = myFile.resolvePath("AIR Test/test.txt");
var myFileStream = new air.FileStream();
myFileStream.open(myFile, air.FileMode.UPDATE);
myFileStream.position = 4000;
alert(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
alert(myFileStream.position); // 4200
不过,有一个例外:对于以 append 模式打开的 FileStream,调用写入方法后
position
属性不变。(在 append 模式中,数据始终写入文件的结尾,而与
position
属性的值无关。)
对于打开进行异步操作的文件,在下一行代码执行之前不会完成写入操作。不过,您可以连续调用多个异步方法,运行时会按顺序执行它们:
var myFile = air.File.documentsDirectory;
myFile = myFile.resolvePath("AIR Test/test.txt");
var myFileStream = new air.FileStream();
myFileStream.openAsync(myFile, air.FileMode.WRITE);
myFileStream.writeUTFBytes("hello");
myFileStream.writeUTFBytes("world");
myFileStream.addEventListener(air.Event.CLOSE, closeHandler);
myFileStream.close();
air.trace("started.");
closeHandler(event)
{
air.trace("finished.");
}
此代码的跟踪输出如下所示:
started.
finished.
您
可以
在调用读取或写入方法后立即(或在任何时间)指定
position
值,下一个读取或写入操作将从该位置开始执行。例如,请注意以下代码在调用
writeBytes()
操作后立即设置
position
属性,即使写入操作完成后
position
仍设置为该值 (300):
var myFile = air.File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream = new air.FileStream();
myFileStream.openAsync(myFile, air.FileMode.UPDATE);
myFileStream.position = 4000;
air.trace(myFileStream.position); // 4000
myFileStream.writeBytes(myByteArray, 0, 200);
myFileStream.position = 300;
air.trace(myFileStream.position); // 300