JavaScript使いのためのAIR入門(3) - AIR APIでファイルの書き込み
クジラ飛行机です。前々回より、JavaScriptが分かる人を対象に、話題の技術 Adobe AIR について解説しています。Adobe AIR は、Web プログラミングで習得した技術(HTML/JavaScript/Flashなど)を利用して、デスクトップアプリケーションを作ることができるのです。今回は主に、AIRのAPIについて紹介します。
前回までのおさらい
前回までで、AIR のインストールから配布パッケージの作成までを書いてみました。Webブラウザ用に書いた、HTML+JavaScriptであれば、ほとんど変更することなくデスクトップアプリケーションにすることにできました。
さて、本稿は、AIRのベータ3(1.0.M6)を使用しています。将来のバージョンでは、多少パラメーターなどが変わる可能性があります。実は、先週までの原稿は、AIRのベータ2に基づいて原稿を書いていたのですが、原稿を書いた直後に、ベータ3が発表され、原稿やプログラムを修正することになってしまいました。
修正と言っても、プログラム自体の変更はそれほどなく、AIR化する際に使用する設定ファイル(XML)のパラメータが変わった程度です。具体的に見ていくと、冒頭で指定しているアプリケーションのネームスペースが「http://ns.adobe.com/air/application/1.0.M5」から「http://ns.adobe.com/air/application/1.0.M6」になりました。
<application xmlns="http://ns.adobe.com/air/application/1.0.M6"
そして、最低限指定するべき設定ファイルの項目が変更されています。こちらは、adl コマンドを実行すると、「xxのパラメータが設定されてない」と教えてくれるので修正も微々たるものです。
AIR のマニュアルによれば、次のように設定パラメータを指定するようにサンプルが書かれていました。
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6">
<id>examples.html.HelloWorld</id>
<version>0.1</version>
<filename>HelloWorld</filename>
<initialWindow>
<content>HelloWorld.html</content>
<visible>true</visible>
<width>400</width>
<height>200</height>
</initialWindow>
</application>
AIR API を使ってみる
AIR では、Web ブラウザのJavaScriptでは実現できない機能を AIR API として提供しています。AIR API では、例えば、ローカルファイルへのアクセスや、データベースの読み書き、オンライン・オフラインの判別などを行うことができます。
これらは、Web ブラウザ上で動く JavaScript ではセキュリティ的に不可能な動作であるので、JavaScript でデスクトップアプリケーションを作る際に欠かせない機能となります。今回は、この中から一番分かりやすいと思われる、ファイルの読み書きを行ってみたいと思います。
以下は、AIR でデスクトップの「a.txt」というファイルに「hello!」と書き込むサンプルプログラムです。始めに実行できることを確かめてみましょう。
AIR の実行に必要なのは、まず、メインのHTMLファイルです。以下は、「Write.html」という名前で保存しました。
<html><head><title>Test</title></head>
<body>
<script type="text/javascript">
// define alias ----- (*1)
var air = {};
air.File = window.runtime.flash.filesystem.File;
air.FileStream = window.runtime.flash.filesystem.FileStream;
air.FileMode = window.runtime.flash.filesystem.FileMode;
// write file
var stream = new air.FileStream();
var file = air.File.desktopDirectory.resolvePath( "a.txt" );
stream.open(file, air.FileMode.WRITE);
stream.writeUTFBytes("hello!");
stream.close();
alert("ok!");
</script>
</body></html>
次に、ADF(Application Descriptor File)と呼ばれるXML形式の設定ファイルを作成します。これは、所定のフォーマットに従って適当に書きます。
「Write.xml」というファイルを作成し内容を以下のように書いて保存します。設定ファイルなので、これを覚える必要はありません。最優先で変えるべきなのは、<initialWindow>の中の<content>タグぐらいでしょうか。
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.0.M6"> <id>com.kujirahand.test.Write</id> <version>0.1</version> <filename>Write</filename> <initialWindow> <content>Write.html</content> <visible>true</visible> <width>400</width> <height>200</height> </initialWindow> </application>
そして、定期的に実行できるように、Windowsで使えるバッチファイルを作っておけば安心です。ここでは、「test.bat」という名前で保存しました。これをダブルクリックすることでプログラムを実行できるでしょう。
adl Write.xml
プログラムが正しく動かない場合は、コマンドラインから実行してエラーメッセージを確認してみてください。動かない理由:
- 正しくAIR SDKがインストールされていますか?
- AIR SDK の bin ディレクトリを環境変数に追加していますか?
- AIR SDK のバージョンが、1.0.M6でしょうか?
正しく動いたなら、プログラムを確認してみましょう。プログラムの冒頭で、AIR API を手軽に利用するために「window.runtime.flash」に続くオブジェクトへのエイリアス(ショートカット)を設定しています。((*1)の部分。)
これで、AIR API のFile や FileStream などのオブジェクトが 「obj = new air.FileStream()」などのような書き方で生成できるようになります。もしエイリアスを利用しない場合には、オブジェクトを作成する時に、「obj = new window.runtime.flash.filesystem.FileStream()」のように非常に長い名前を書かなくてはなりません。
※ここでは、自分でオブジェクトへのショートカットを指定しましたが、AIR SDKの「frameworks」ディレクトリの中にある「AIRAliases.js」にエイリアスが記述されています。
もし「AIRAliases.js」を同じディレクトリにコピーするなら、プログラムは次のように書き換えができるでしょう。
.. 省略 .. <body> <script type="text/javascript" src="AIRAliases.js"></script> <script type="text/javascript"> var stream = new air.FileStream(); var file = air.File.desktopDirectory.resolvePath( "a.txt" ); .. 省略 ..
次にファイルへ値を書き込む手順ですが、次のようにします。(ファイルにデータを書き込むだけですが、ちょっとしたコツが必要です。覚えてしまえばなんてことないのですが。)
- 1.書き込み用の FileStream オブジェクトを作る
- 2.Fileオブジェクトを取得する
- 3.Fileオブジェクトを指定して、FileStream を開く
- 4.書き込みを行う
- 5.FileStream を閉じる
特に、面倒に感じるのは、手順2でファイルを開くために、Fileオブジェクトを取得する必要があるということです。
Fileオブジェクトには、いろいろな特殊ディレクトリが定義されています。
| エイリアス名 | ディレクトリ説明 |
| air.File.desktopDirectory | デスクトップ |
| air.File.documentsDirectory | マイドキュメント |
| air.File.applicationDirectory | アプリケーションディレクトリ |
| air.File.applicationStorageDirectory | アプリごとの保存ディレクトリ |
これらのディレクトリを得て、ファイル名"a.txt"を指す File オブジェクトを取得するには、次のように「resolvePath()」メソッドを利用しなければなりません。
var desktop = air.File.desktopDirectory;
var obj_file = desktop.resolvePath("a.txt");
ただ、便利なことに、一度、File オブジェクトを取得してしまえば、いろいろな便利なプロパティを利用することができるようになります。以下は、「a.txt」が存在するかどうかを表す「exists」プロパティをチェックしています。
<script type="text/javascript" src="AIRAliases.js"></script>
<script type="text/javascript">
var desktop = air.File.desktopDirectory;
var obj_file = desktop.resolvePath("a.txt");
if (obj_file.exists) {
alert("a.txt は存在する");
} else {
alert("a.txt は存在しない");
}
</script>
File オブジェクトさえ分かってしまえば、stream への書き込みは、Javaなど一般的なプログラミング言語のものと手順が似ているので、それほど抵抗がないでしょうか。FileStream オブジェクトを生成して、ファイルを開き、書き込みなどの処理を行って、最後にこれを閉じるという流れです。
それから、ファイルの指定方法ですが、resolvePath() メソッドを利用する他に、次のような書き方もできます。
<script type="text/javascript" src="AIRAliases.js"></script>
<script type="text/javascript">
var f = new air.File("app-storage:/a.txt");
var stream = new air.FileStream();
stream.open(f, air.FileMode.WRITE);
stream.writeUTFBytes("test");
stream.close();
</script>
ポイントは、ファイルオブジェクトの取得方法で「new air.File("パス")」のように書いているところです。File オブジェクトのコンストラクタに「app-storage:/ファイル名」を指定すると、「air.applicationStorageDirectory」から resolvePath() メソッドを使うのと同じになります。
ちなみに、アプリケーションごとのストレージディレクトリは、ADF(XML形式の設定ファイル)に指定した id に関連したディレクトリを指します。例えば、今回 id に「com.kujirahand.test.Write」を指定していますが、Windows Vista の環境だと、「C:\Users\ユーザー名\AppData\Roaming\com.kujirahand.test.Write\Local Store」を指しています。
まとめ
今回は、AIR に備わっている API の中から、File と FileStream を利用して、テキストファイルの書き込みを行うプログラムを作ってみました。こうした OS ネイティブの機能を利用できるのが、AIR の強みです。どのOSでも問題なく動くように、File オブジェクトは高度に抽象化されていますので、若干指定が面倒に感じますが慣れの問題でしょう。
また、「AIRAliases.js」を取り込むことで、長いオブジェクト名を「air.XXX」のような短いオブジェクト名で操作できることも紹介しました。AIRのAPIマニュアルを見ても、このファイルを利用することを前提にして書かれています。マニュアルを見ると、利用できる機能が俯瞰できますので、一度目を通してみると面白いでしょう。
TrackBack URL :
