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

読み取り機能を指定して FileStream オブジェクトを開いた場合(fileMode パラメータ(open() メソッドまたは openAsync() メソッドのパラメータ)を READ または UPDATE に設定した場合)、ランタイムでデータが内部バッファに格納されます。FileStream オブジェクトでのバッファへのデータの読み取りは、(FileStream オブジェクトの open() メソッドまたは openAsync() メソッドを呼び出して)ファイルを開くとすぐに開始されます。

同期操作用に(open() メソッドを使用して)開いたファイルでは、いつでも position ポインタに任意の有効な位置(ファイルの範囲内)を指定して、任意の量のデータ(ファイルの範囲内)の読み取りを開始できます。次にコードの例を示します(ファイルに 100 バイト以上あることを前提にしています)。

var myFile = air.File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream = new air.FileStream(); 
myFileStream.open(myFile, air.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 = new air.ByteArray(); 
var myFile = new air.File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream = new air.FileStream(); 
myFileStream.addEventListener(air.ProgressEvent.PROGRESS, progressHandler); 
myFileStream.openAsync(myFile, air.FileMode.READ); 
 
function progressHandler(event)  
{ 
    myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); 
}

非同期で開かれたファイルでは、読み取りバッファ内のデータのみを読み取ることができます。また、データを読み取ると、読み取りバッファからそのデータは削除されます。読み取り操作を行う場合は、読み取り操作を呼び出す前に、読み取りバッファにデータが存在することを確認する必要があります。例えば、次のコードでは、ファイル内の位置 4000 から始まる 8000 バイトのデータを読み取ります。

var myFile = air.File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream = new air.FileStream(); 
myFileStream.addEventListener(air.ProgressEvent.PROGRESS, progressHandler); 
myFileStream.addEventListener(air.Event.COMPLETE, completed); 
myFileStream.openAsync(myFile, air.FileMode.READ); 
myFileStream.position = 4000; 
 
var str = ""; 
 
function progressHandler(event)  
{ 
    if (myFileStream.bytesAvailable > 8000 ) 
    { 
        str += myFileStream.readMultiByte(8000, "iso-8859-1"); 
    } 
}

書き込み操作中は、FileStream オブジェクトでは読み取りバッファにデータを読み取りません。書き込み操作が完了すると(書き込みバッファ内のすべてのデータがファイルに書き込まれると)、FileStream オブジェクトでは新しい読み取りバッファを開始し(関連付けられている FileStream オブジェクトが読み取り機能を指定して開かれている場合)、position プロパティで指定された位置から、読み取りバッファへのデータの読み取りを開始します。position プロパティは、書き込まれた最後のバイトの位置にするか、別の位置を指定することもできます。別の位置を指定するには、書き込み操作後に position プロパティに別の値を指定します。