讀取緩衝區和 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 物件指定不同的值,則會是不同的位置。