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