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 屬性的值:
當您呼叫 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
|
|