読み取りバッファーと FileStream オブジェクトの bytesAvailable プロパティ

Adobe AIR 1.0 およびそれ以降

読み取り機能を指定して FileStream オブジェクトを開いた場合( open() メソッドまたは openAsync() メソッドの fileMode パラメーターを READ または UPDATE に設定した場合)、ランタイムでデータが内部バッファーに格納されます。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 プロパティで表される「使用可能な」バイトから読み取りを行います。同期的に読み取る場合は、常にファイルのすべてのバイトが使用可能です。非同期で読み取る場合は、非同期バッファーへの入力が progress イベントによって通知されるにつれて、 position プロパティで指定された位置以降のバイトが使用可能になります。

同期 操作用に開いたファイルでは、 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 プロパティに別の値を指定します。