Apolloプログラミング入門(3)
Apollo File APIを用いて
ローカルファイルを読むには?


クラスメソッド
横田聡
2007/6/7


 同期メソッドと非同期メソッド

 Flashなど非同期に動くアプリケーションを書く場合、イベントリスナーを用いたイベント駆動のプログラミングが一般的です。

 Apollo File APIでも、同じようにイベントリスナーを使って、ファイルが開き終わったり、ファイルをコピーし終わったらイベントが発生するように記述できます。同期処理は上から流れるように処理が進むので記述が非常に簡単です。

 一方、大きなファイルを扱うときに、同期処理を使っては処理が止まってしまいます。Apollo File APIは用途に応じて、同期・非同期処理を使い分けできます。以下に、同期・非同期のメソッド一覧を載せます。

処理内容 同期 非同期
ファイルコピー File.copyTo() File.copyToAsync()
ディレクトリ削除 File.deleteDirectory() File.deleteDirectoryAsync()
ファイル削除 File.deleteFile() File.deleteFileAsync()
ディレクトリ一覧 File.listDirectory() File.listDirectoryAsync()
ファイル移動 File.moveTo() File.moveToAsync()
ファイルゴミ箱へ File.moveToTrash() File.moveToTrashAsync()

 画像ファイルも読み込める

 テキストファイルを読み込むように、画像ファイルを読み込み表示してみましょう。

 まずは、実行結果を見てください。デスクトップ上に置いてある画像ファイル名を指定してボタンをクリックすると画像が表示されます。

画面4 画像ファイルの読み込みアプリの例
画面4 画像ファイルの読み込みアプリの例

 ソースコードもテキストファイルを読み込むのとよく似ています。違う部分はバイナリデータを読み込むところです。

<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml"
                        layout="vertical">
    <mx:Script>
    <![CDATA[
        import flash.filesystem.File;
        import flash.filesystem.FileMode;
        import flash.filesystem.FileStream;

        private function readImageFile(fileName:String):void{
            var str:String;
            try{
                var file:File = File.desktopDirectory;
                file = file.resolve(fileName);
                var fs:FileStream = new FileStream();
                fs.open(file,FileMode.READ);

                var ba:ByteArray = new ByteArray();
                fs.readBytes(ba,0,file.size);
                var loader:Loader = new Loader();
                loader.loadBytes(ba);
                img.addChild(loader);

                fs.close();
            }catch(e:Error){
                str=e.message;
            }
            return str;
        }
    ]]>
    </mx:Script>
    <mx:TextInput id="fileName" fontSize="15"/>
    <mx:Button click="{ta.text = readImageFile(fileName.text)}"
               label="画像ファイルを読む"/>
        <mx:Label id="mes"/>
        <mx:Image id="img" />
</mx:ApolloApplication>

 FileStreamクラスのreadBytesメソッドは、指定されたファイルをバイト列として読み込みます。

var ba:ByteArray = new ByteArray();
fs.readBytes(ba,0,file.size);

 次に、Loaderクラスを用いてバイト列から画像を再現します。再現した画像データはImageタグに載せて表示させます。Loaderクラスはバイト列から自動的にJPG、PNG、GIFを判別してくれます。

var loader:Loader = new Loader();
loader.loadBytes(ba);
img.addChild(loader);

FileStreamクラスを使わずに画像を読み込む

 また、FileStreamクラスを使わなくても、画像を読み込むこともできます。以下はその例です。

<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml"
                        layout="vertical">
    <mx:Script>
    <![CDATA[
        import flash.filesystem.File;
        import flash.filesystem.FileMode;
        import flash.filesystem.FileStream;
        import flash.net.URLRequest;

        private function readImageFile(fileName:String):void{
            var str:String;
            var file:File = File.desktopDirectory;
            file = file.resolve(fileName);
            var loader:Loader = new Loader();

            var urlReq:URLRequest = new URLRequest(file.url);
            loader.load(urlReq);

            img.addChild(loader);
        }
    ]]>
    </mx:Script>
    <mx:TextInput id="fileName" fontSize="15"/>
    <mx:Button click="{ta.text = readImageFile(fileName.text)}"
               label="画像ファイルを読む"/>
        <mx:Image id="img" />
</mx:ApolloApplication>

 Loaderクラスは指定されたURLから読み込むこともできます。Apolloは、ファイルパスをURL形式で指定できますので、同じようにURL指定で画像を読み込むこともできます。

var urlReq:URLRequest = new URLRequest(file.url);
loader.load(urlReq);

パスを取得するには?

 ちなみに、以下のようにtrace文を挿入してデバッグ実行すると、

trace(file.url);
trace(file.nativePath);

 以下のように、それぞれURL形式とOSネイティブ形式のパスが取得できます。

file:///C:/Documents%20and%20Settings/satoshi/デスクトップ/logo.png
C:\Documents and Settings\satoshi\デスクトップ\logo.png

 次回はさまざまなファイルの書き込みについて

 いかがでしたでしょうか? Apollo File APIを用いて、簡単にローカルファイルにアクセスできました。今回はファイルを読み込むことが中心でしたので、次回は書き込みについて解説をする予定です。特に、テキストファイル、画像、XMLファイルなどについてご紹介します。

@IT関連記事


Apollo参戦でウィジェット開発者の争奪戦が激化
Ajax うきうき Watch(19) 似て非なるウィジェット開発のテクノロジ。互換性がないYahoo!ウィジェット、WPFに、Adobe Apolloの参戦で開発者の争奪戦がいよいよ始まる
リッチクライアント & 帳票」フ ォーラム 2007/3/26
ブラウザの限界を超える「今」のリッチコンテンツ
Webオーサリングツールを使ってみよう(番外編) これまで2回にわたって紹介したWebオーサリングツールを離れてリッチコンテンツを取り巻く「今」の状況に注目しよう
リッチクライアント & 帳票」フ ォーラム 2007/5/22
リッチクライアントの潮流とFlexのオープンソース化
WCR Watch(18) 先日開催されたソフトウェア開発環境展(SODEC)に初のリッチクライアント ゾーンが設けられた話題やFlexのオープンソース化について解説する
リッチクライアント & 帳票」フォーラム 2007/5/29

 

プロフィール:横田 聡(よこた さとし)
クラスメソッド株式会社  代表取締役
業務向けアプリのRIA化を推進している会社です。業務ポータル/ビジネスインテリジェンス/顧客管理/営業支援のシステムなどワンストップで作っています。 最近は、業務向けモバイルアプリ開発や特定ユーザー向けアプリ開発なども行なっています。主にApollo/Flex/Java/C#/Flash/JavaScriptを使って仕事をしています。社員募集中です。
会社ブログ(YOKOTA-LOG)と個人ブログ(FlexCoder)も更新中。

2/2 次回もお楽しみに

 INDEX
Apolloプログラミング入門(3)
  Page1
Webアプリからはローカルファイルにアクセスしづらい│テキストファイルを開いて読み込んでみよう
Page2
同期メソッドと非同期メソッド│画像ファイルも読み込める│次回はさまざまなファイルの書き込みについて




HTML5 + UX フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日 月間