FileStream 对象的 position 属性

Adobe AIR 1.0 和更高版本

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