FileStream 物件的 position 屬性

Adobe AIR 1.0 以及更新的版本

FileStream 物件的 position 屬性可以決定資料在下一個讀取或寫入方法的讀取和寫入位置。

執行讀取或寫入作業之前,請先將 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."); 
}

以下為上述程式碼的 trace 輸出:

started. 
finished.

您「可以」在呼叫讀取或寫入方法之後立即 (或隨時) 指定 position 值,然後下一個讀取或寫入作業便會在該位置開始執行。例如,請注意下列程式碼會在呼叫 writeBytes() 作業之後立即設定 position 屬性,而且 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