非同期プログラミングと非同期で開いた FileStream オブジェクトで生成されるイベントAdobe AIR 1.0 およびそれ以降 ファイルを(openAsync() メソッドを使用して)非同期で開いた場合、ファイルの読み取りおよび書き込みは非同期で実行されます。読み取りバッファーへのデータの読み取り中や出力データの書き込み中に、他の ActionScript コードを実行することができます。 そのため、非同期で開いた FileStream オブジェクトによって生成されるイベントに登録する必要があります。 次のように、progress イベントに登録すると、新しいデータが読み取り可能になったときに通知を受けることができます。 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);
var str:String = "";
function progressHandler(event:ProgressEvent):void
{
str += myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}
次のように、complete イベントに登録すると、データ全体を読み取ることができます。 var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt");
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(myFile, FileMode.READ);
var str:String = "";
function completeHandler(event:Event):void
{
str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}
入力データをバッファーに格納して非同期読み取りを有効にする場合とほぼ同じようにして、非同期ストリームに書き込んだデータは、バッファーに格納されて非同期でファイルに書き込まれます。データがファイルに書き込まれると、FileStream オブジェクトから定期的に OutputProgressEvent オブジェクトが送出されます。OutputProgressEvent オブジェクトには、書き込まれる残りのバイト数が設定された bytesPending プロパティがあります。outputProgress イベントに登録すると、このバッファーが実際にファイルに書き込まれたときに通知を受けることができます(進捗状況ダイアログを表示する場合などに便利です)。ただし、一般には、このようにする必要はありません。具体的に言うと、書き込まれていないバイトについては考慮せずに、close() メソッドを呼び出すことができます。FileStream オブジェクトでは引き続きデータの書き込みが行われ、最後のバイトがファイルに書き込まれて書き込み元のファイルが閉じられた後に close イベントが送出されます。 |
|