ファイルのオープン/クローズ
前回はFileオブジェクトを使ってファイルのコピーや削除といった操作を行いました。AIRアプリケーションは,
読み書きの対象となるファイルは,
open()メソッドとopenAsync()メソッドは,
FileMode. | 読み込み専用。 |
FileMode. | 書き込み専用。ファイルは常に上書きされる。ファイルが存在しなければオープン時に作成される。 |
FileMode. | 書き込み専用。データは常にファイル末尾に追記される。ファイルが存在しなければオープン時に作成される。 |
FileMode. | 読み書き両用。ファイルの任意の位置から読み書き可能。ファイルが存在しなければオープン時に作成される。 |
open()メソッドもopenAsync()メソッドも,
ファイルの読み込み
では,
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="340" height="300">
<mx:Script>
<![CDATA[
import flash.filesystem.*;
private function readData():void {
var file:File = File.desktopDirectory.resolve("sample.txt");
var stream:FileStream = new FileStream();
try {
stream.open(file, FileMode.READ);
var str:String = stream.readUTFBytes(stream.bytesAvailable);
output.text = str.replace(/\r\n/g, "\n");
} catch (error:IOError) {
trace(error.message);
} finally {
stream.close();
}
}
]]>
</mx:Script>
<mx:TextArea x="20" y="20" id="output" width="300" height="200" fontSize="16"/>
<mx:Button x="136" y="246" label="読み込み" click="readData()"/>
</mx:WindowedApplication>
ここでは読み込みのみを行うので, readUTFBytes()メソッドには引数として読み込むデータの長さを指定します。ここで指定しているFileStream. 次は上記のサンプルを非同期処理に変更してみましょう。 非同期処理の場合, openAsync()メソッドでファイルをオープンするとバッファへのデータ入力が開始されるので,
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="340" height="300">
<mx:Script>
<![CDATA[
import flash.filesystem.*;
private var stream:FileStream;
private function readData():void {
var file:File = File.desktopDirectory.resolve("sample.txt");
stream = new FileStream();
stream.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
stream.addEventListener(ProgressEvent.PROGRESS, onInputProgress);
stream.addEventListener(Event.COMPLETE, onInputComplete);
stream.addEventListener(Event.CLOSE, onCloseFile);
stream.openAsync(file, FileMode.READ);
}
private function onIOError(event:IOErrorEvent):void {
trace("I/Oエラー");
stream.close();
}
private function onInputProgress(event:ProgressEvent):void {
trace(stream.bytesAvailable + "バイト読み込み済み");
}
private function onInputComplete(event:Event):void {
try {
var str:String = stream.readUTFBytes(stream.bytesAvailable);
output.text = str.replace(/\r\n/g, "\n");
} catch (error:IOError) {
trace(error.message);
} finally {
stream.close();
}
}
private function onCloseFile(event:Event):void {
trace("ファイルをクローズしました");
}
]]>
</mx:Script>
<mx:TextArea x="20" y="20" id="output" width="300" height="200" fontSize="16"/>
<mx:Button x="136" y="246" label="読み込み" click="readData()"/>
</mx:WindowedApplication>