AdobeAIRでファイル(入)出力

タリーズコーヒーで3時間ほどAdobeAIRのファイル入出力について勉強&コーディングしました。

DSC02214

AdobeAIRはデスクトップアプリケーションとしてアプリケーションを作成できるので、セキュリティの問題を考えずにファイルの入出力を行うことができます。


処理の流れは、
1、URLLoaderでウェブ上の画像をロードする。
2、ロードが完了したらURLLoader.dataに格納されているロード結果をFileStreamに渡す。
3、FileStreamはFileで表されるファイルにURLLoader.dataを書き出す。
という感じ。
・・・書いててコードとずいぶん違う事を書いてしまったなぁと思ったりした。
詳しくはソースコードを見てください!(←説明を投げた


以下、ウェブ上から画像をダウンロードして保存するコードです。
connect()を呼ぶ事でウェブへのアクセスおよび画像の保存が行われます。

//ウェブ上のファイルにアクセスする為のURLローダー。
private var imageLoader:URLLoader;

private function connect():void{
	
	//imageLoaderをバイナリデータ通信として利用する為に設定
	imageLoader = new URLLoader();
	
	//バイナリモードに設定
	imageLoader.dataFormat = URLLoaderDataFormat.BINARY;
	//通信が完了した際に発生するイベントのリスナを設定
	imageLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
	//IOエラーの際に発生するイベントのリスナを設定
	imageLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	//進捗状況を通知するイベントのリスナを設定
	imageLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
	//セキュリティの問題が生じた際に発生するイベントのリスナを設定
	imageLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
	
	//ロードを開始
	imageLoader.load(new URLRequest("http://farm4.static.flickr.com/3188/2444800937_7d121f71e5_b.jpg"));
	
}

//imageLoaderのロードが完了したらファイルへの書き込みを開始
private function loadCompleteHandler(evt:Event):void{
	loadImage();
}	
	
private function securityErrorHandler(evt:SecurityErrorEvent):void{
	Alert.show(evt.text, "SecurityError");
}
	
private function ioErrorHandler(evt:IOErrorEvent):void{
	Alert.show(evt.text, "IOError");
}

//進捗状況を表示するハンドラ
private function progressHandler(evt:ProgressEvent):void{
	trace(evt.bytesLoaded + "/" + evt.bytesTotal);
}

//ファイル書き込みを行うメソッド
private function loadImage():void{
	//Fileオブジェクトを作る
	var file:File = File.documentsDirectory;
	
	//各種イベントリスナを登録(imageLoaderの使い回し)
	file.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	file.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
	file.addEventListener(ProgressEvent.PROGRESS, progressHandler);
	
	//出力ファイル名を指定
	file = file.resolvePath("outputImage.jpg");
	
	//ファイルストリームを生成
	fileStream = new FileStream();
	
	//ファイルストリームに各種イベントリスナを登録
	fileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
	fileStream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, progressHandler);
	
	//ストリームをWriteモードでオープン
	fileStream.open(file, FileMode.WRITE);
	
	//ストリームにバイナリデータを書き出し
	fileStream.writeBytes(imageLoader.data);
	
	//書き出しが終わったらストリームを閉じる。これを忘れない!
	fileStream.close();
	
}

今回のコードはタリーズコーヒープログラミングおよびその前日に行った @minotiiku とのプログラミング合宿で作ったプログラムの一部を抜き出し、書き直したものなので、上記のままだとコンパイルが通らないかもしれません。その際はおこらないでください。


このほかにも正規表現(RegExpクラス)なんかを使ってHTMLを解析したりもしたんですが、今回は割愛させていただきます。
なお、上記のソースコードを利用する事で利用者が何らかの被害を被ったとしても、私、Mineは何の責任も負いません。


ではでは。皆さんよいプログラミング生活を!