アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » Adobe AIRで作るデスクトップアプリケーション » 第8回 ファイルシステムAPI(その2)

Adobe AIRで作るデスクトップアプリケーション

第8回 ファイルシステムAPI(その2)

ファイルのオープン/クローズ

前回はFileオブジェクトを使ってファイルのコピーや削除といった操作を行いました。AIRアプリケーションは,ファイルの内容を読み込んだり,ファイルにデータを書き込んだりもできます。ファイルの読み書きを行うには,Fileクラスの他にFileStreamクラスを使用します。

読み書きの対象となるファイルは,処理を行う前にオープンし,処理が終わったらクローズする必要があります。オープンしている間は,他のアプリケーションから見ると使用中ということです。オープンはFileStreamクラスのopen()メソッドまたはopenAsync()メソッドで行います。前者は同期メソッド,後者は非同期メソッドです。同期/非同期については前回の記事を参考にしてください。クローズはclose()メソッドで行います。

open()メソッドとopenAsync()メソッドは,どちらも2つの引数を取ります。第1引数は操作対象のファイルを指定したFileオブジェクト,第2引数はファイルモードです。ファイルモードとは,どのような操作を前提にファイルをオープンするか指定するものです。指定できる値はFileModeクラスの定数として定義されていて,次の4つがあります。

FileMode.READ読み込み専用。
FileMode.WRITE書き込み専用。ファイルは常に上書きされる。ファイルが存在しなければオープン時に作成される。
FileMode.APPEND書き込み専用。データは常にファイル末尾に追記される。ファイルが存在しなければオープン時に作成される。
FileMode.UPDATE読み書き両用。ファイルの任意の位置から読み書き可能。ファイルが存在しなければオープン時に作成される。

open()メソッドもopenAsync()メソッドも,READまたはUPDATEを指定してファイルをオープンすると,すぐにランタイム内部の入力バッファにデータを読み込み始めます。同期メソッドであるopen()の場合,バッファにすべてのデータが格納されてから次の処理に移りますが,非同期メソッドのopenAsync()の場合はバッファへの読み込みをイベントで監視して必要な処理を行います。

ファイルの読み込み

では,UTF-8のテキストファイルを読み込んでみましょう。次のサンプルは,同期処理でファイルを読み書きする際の基本的な流れです。ボタンをクリックするとデスクトップ上のsample.txtを読み込みテキストエリアに表示します。

<?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>

外部ファイルからデータを読み込む

外部ファイルからデータを読み込む

ここでは読み込みのみを行うので,open()メソッドでFileMode.READを指定してオープンします。続いて実行しているreadUTFBytes()がUTF-8のデータを読み込むメソッドです。ファイルが見つからなかったり読み込めなかったりした場合,これらのメソッドはIOErrorをスローします。エラーが発生するしないに関わらずファイルはクローズしておきたいので,finally節にclose()メソッドを記述しています。

readUTFBytes()メソッドには引数として読み込むデータの長さを指定します。ここで指定しているFileStream.bytesAvailableは,入力バッファから現在どれだけのデータが読み込み可能か示すプロパティです。前述のようにopen()メソッドの場合は次の処理に移った時点でバッファへの読み込みが完了しているので,すべてのデータを一度に取得できます。なお,改行コードCR+LFをそのまま表示すると2つの改行コードとして認識されるため,テキストエリアへ設定する前にString.replace()メソッドでLFのみに置換しています。

次は上記のサンプルを非同期処理に変更してみましょう。

<?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>

非同期処理の場合,バッファへデータが入力される度にProgressEvent.PROGRESSイベントが配信され,バッファへの入力が完了するとEvent.COMPLETEイベントが配信されます。また,エラー発生時に配信されるIOErrorEvent.IO_ERRORイベント,ファイルのクローズ時に配信されるEvent.CLOSEイベントもあります。これらのイベントを処理するには,ファイルをオープンする前にイベントハンドラを登録しておく必要があります。

openAsync()メソッドでファイルをオープンするとバッファへのデータ入力が開始されるので,完了イベントを受けてreadUTFBytes()メソッドを実行します。このようにバッファからの読み込み自体は同期処理となります。

著者プロフィール

タナカヤスヒロ

早稲田大学卒業後,DTP業務を経てマルチメディア系制作会社へ。Macromedia Directorにのめり込む。フリーランスとなりFlashにシフトしてからもデスクトップ絡みの仕事が絶えず,Apolloにも勝手に縁を感じている。現在株式会社antsに所属。ants Lab.にも記事を上げている。

URLhttp://labs.anthill.jp/

著書

  • ActionScript逆引きクイックリファレンス

    ActionScript逆引きクイックリファレンス(毎日コミュニケーションズ)

  • GIZMO Programmer's Bible FLASHによるガジェット開発

    GIZMO Programmer's Bible FLASHによるガジェット開発(毎日コミュニケーションズ)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

サイエンスに片思い

本連載では,サイエンスという学問を軸に,そこから広がる可能性やつながり,そしてWebの世界との関係について,前田邦宏氏がさまざまな取材を元に考察し,これからの可能性について展望します。

使ってみよう! Windows Live SDK/API

Windows Liveサービスの一部にはAPIやSDKとして提供されているものがあります。本連載では各API・SDKの紹介とそれらを利用したアプリケーションを開発していきます。

Lifelog~毎日保存したログから見えてくる個性

コンピュータを使って,日常のさまざまなことの記録(ログ)をとり,それを分析して活用することで,もう一段階上の「楽な生活」をめざす日々の研究報告です。

もっと便利に!jQueryでラクラクサイト制作(実践サンプル付き)

本連載では,実践サンプルとともに,jQueryを上手に活用してサイト制作の品質向上・効率化を実現するための実践テクニックを解説します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス