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 |
|