開啟具有讀取功能 (
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
物件指定不同的值,則會是不同的位置。