讀取緩衝區和 FileStream 物件的 bytesAvailable 屬性Adobe AIR 1.0 以及更新的版本 開啟具有讀取功能 (open() 或 openAsync() 方法的 fileMode 參數設定為 READ 或 UPDATE) 的 FileStream 物件時,執行階段會將資料儲存在內部緩衝區中。FileStream 物件會在您開啟檔案 (藉由呼叫 FileStream 物件的 open() 或 openAsync() 方法) 時,立即開始將資料讀取至緩衝區。 對於開啟供執行同步作業的檔案 (使用 open() 方法),您一律可以將 position 指標設定為任何有效的位置 (必須在檔案的範圍內) 並開始讀取任意資料量 (必須在檔案的範圍內),如下列程式碼 (其中假設檔案至少包含 100 個位元組) 所示: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.READ); myFileStream.position = 10; myFileStream.readBytes(myByteArray, 0, 20); myFileStream.position = 89; myFileStream.readBytes(myByteArray, 0, 10); 無論檔案是開啟供執行同步還是非同步作業,讀取方法一定都會從「可用」的位元組 (由 bytesAvalable 屬性表示) 來讀取資料。以同步方式讀取時,檔案的所有位元組隨時都可供讀取。以非同步方式讀取時,則只能從 position 屬性指定的位置之後的位元組開始讀取,並且會在每次非同步緩衝區填滿資料時傳送 progress 事件。 對於開啟供執行「同步」作業的檔案,bytesAvailable 屬性一律設定為表示從 position 屬性到檔案結尾的位元組數 (檔案中的所有位元組都可供讀取)。 對於開啟供執行「非同步」作業的檔案,您必須確保讀取緩衝區中已經有足夠的資料,才能呼叫讀取方法。對於以非同步方式開啟的檔案,隨著讀取作業的進行,會將檔案的資料 (亦即當讀取作業開始,位於 position 指定之位置的資料) 加入至緩衝區,而且每一次讀取位元組時,bytesAvailable 屬性都會遞增。bytesAvailable 屬性表示從 position 屬性指定的位置開始,到緩衝區結尾的可用位元組數。FileStream 物件會定期傳送 progress 事件。 對於以非同步方式開啟的檔案,當讀取緩衝區中的資料已經可供使用時,FileStream 物件便會定期傳送 progress 事件。例如,下列程式碼會在將資料讀取至緩衝區之後,將這些資料讀取至 ByteArray 物件 bytes 中: var bytes:ByteArray = new ByteArray(); var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.openAsync(myFile, FileMode.READ); function progressHandler(event:ProgressEvent):void { myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); } 對於以非同步方式開啟的檔案,只有讀取緩衝區中的資料才可供讀取。此外,當您讀取資料時,就會從讀取緩衝區中移除該資料。對於讀取作業,您必須確保讀取緩衝區中有資料,才能呼叫讀取作業。例如,下列程式碼會從檔案中 4000 這個位置,讀取 8000 個位元組資料: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.addEventListener(Event.COMPLETE, completed); myFileStream.openAsync(myFile, FileMode.READ); myFileStream.position = 4000; var str:String = ""; function progressHandler(event:Event):void { if (myFileStream.bytesAvailable > 8000 ) { str += myFileStream.readMultiByte(8000, "iso-8859-1"); } } 在寫入作業期間,FileStream 物件不會將資料讀取至讀取緩衝區中。當寫入作業完成時 (亦即,寫入緩衝區中的所有資料都已經寫入至檔案),FileStream 物件會啟動新的讀取緩衝區 (假設相關聯的 FileStream 物件在開啟時具有讀取功能),並且從 position 屬性指定的位置,開始將資料讀取至該讀取緩衝區中。position 屬性會是最後一個位元組的寫入位置,但是如果使用者在寫入作業完成後,為 position 物件指定不同的值,則會是不同的位置。 |
|