アクセシビリティ
デベロッパーリソース

Robert Dixon

Jeff Swartz

シニアテクニカルライター
Adobe

作成日:
2008年2月25日
ユーザレベル:
中級, 上級
製品:
Adobe AIR

テキストファイルエディタの構築

Text Editor サンプルアプリケーションは、Adobe AIR のファイルを操作するための次のような機能を示します。

  • File オブジェクトで参照するファイルパスを設定します。
  • FileMode クラスと FileStream クラスを使用してファイルからデータを読み取ります。
  • FileMode クラスと FileStream クラスを使用してファイルからデータを書き込みます。

注意:このサンプルアプリケーションは、説明のためにそのままの状態で提供されています。

Text Editor アプリケーション

図 1. プレーンテキストファイルの単純なエディタのサンプルアプリケーション

要件

この記事に書かれた操作を行うには、次のソフトウェアとファイルが必要です。

Adobe AIR

Adobe AIR SDK

サンプルファイル:

このサンプルアプリケーションには、次のファイルが含まれています。

  • Index.html:メインアプリケーションコンテンツ。
  • AIRAliases.js:AIR JavaScript エイリアスファイル。
  • Application.xml:アプリケーションのデバッグおよびビルドを行う(ADL と ADT を使用)場合に使用する AIR アプリケーション記述子ファイル。
  • サンプル AIR アイコンファイル。

前提知識

HTML ベースのアプリケーション構築の経験があることが推奨されます。このクイックスタートの開始方法について詳しくは、「Building the Quick Start sample applications with HTML」を参照してください。

アプリケーションのテスト

アプリケーションのインストーラ(TextEditorHTML.air)をダウンロードして起動し、アプリケーションをインストールします。このアプリケーションは、プレーンテキストファイルの単純なエディタです。すべてのテキストファイルの読み書きに UTF-8 エンコーディングを使用します。

コードの理解

AIR クラスの使用方法について詳しくは、「Adobe AIR Language Reference for HTML Developers」を参照してください。

File オブジェクトが参照するファイルの指定

init() メソッドは、定義済みのパスを参照するように defaultDir File オブジェクトを設定します。

defaultDir = air.File.documentsDirectory;

このコードでは、ユーザのドキュメントディレクトリを参照するようにオブジェクトを設定しています。Windows では、これはマイドキュメントディレクトリになります。Mac OS では、/Users/userName/Documents ディレクトリです。

ユーザがファイルパスを指定していない場合、defaultDir ファイルは、後で FileChooser ウィンドウによって参照されます。

ファイルの参照

ユーザが「開く」ボタンをクリックすると、openFileDB() メソッドで File オブジェクトの browseForOpen() メソッドが呼び出され、新しいファイル参照ダイアログボックスが開きます。

var fileChooser;
if(currentFile)
{
    fileChooser = currentFile;
}
else
{
    fileChooser = defaultDir;
}
fileChooser.browseForOpen("Open");

ユーザがメインウィンドウで「Save As」ボタンをクリックすると、saveAs() メソッドで同様に File オブジェクトの browseForSave() メソッドが呼び出されます。

var fileChooser;
if(currentFile)
{
    fileChooser = currentFile;
}
else
{
    fileChooser = defaultDir;
}
fileChooser.browseForSave("Save");

ファイルの読み取り

ユーザが開くファイルを選択すると、fileChooser File オブジェクトから select イベントが送出されます。openFile() 関数は、このイベントのイベントリスナーとして登録されています。この関数で、stream という新しい FileStream オブジェクトが設定されます。

stream = new air.FileStream();
try
{
    document.getElementById("mainText").value = "";
    currentFile = event.target;
    stream.open(currentFile, air.FileMode.READ);
    var str = stream.readUTFBytes(stream.bytesAvailable);
    stream.close();
    document.getElementById("mainText").value = str;
    document.title = "Text Editor - " + currentFile.name;
}
catch(error)
{
    ioErrorHandler()
}

注意:ファイルを開いて読み取るコードは try/catch 構造で囲まれているので、I/O エラーが発生すると、ioErrorHandler() メソッドが呼び出されます。

ストリームオブジェクトの open() メソッドには、2 つのパラメータがあります。

  • 1 つ目のパラメータは、開く File オブジェクト(この場合は、アプリケーションのメインファイルオブジェクト)です。
  • 2 つ目のパラメータは、FileMode クラスのいずれかの定数(この場合は、データの読み取りが可能な READ 定数)で定義されたファイルモードです。

readUTFBytes() メソッドでは、ファイルから UTF-8 テキストデータが読み取られます。このメソッドのパラメータは stream.bytesAvailable に渡されるので、ファイル全体が読み取られます。読み取られたデータは、ページの mainText TEXTAREA 要素に渡されます。

この例では、open() メソッドを使用して、同期操作用にファイルを開いています。また、openAsync() メソッドを使用して、非同期操作用にファイルを開くこともできます。ただし、非同期操作用にファイルを開いた場合は、complete イベントおよび ioError イベントを処理するようイベントリスナーを設定する必要があります。

ファイルへのデータの書き込み

ユーザが「保存」ボタンをクリックすると、saveFile() メソッドが呼び出されます。このメソッドで、stream という新しい FileStream オブジェクトが設定され、データがファイルに書き込まれます。

try
{
    stream = new air.FileStream();
    stream.open(file, air.FileMode.WRITE);
    var outData = document.getElementById("mainText").value;
    outData = outData.replace(/\n/g, air.File.lineEnding);
    stream.writeUTFBytes(outData);
    document.title = "Text Editor - " + file.name;
}
catch(error)
{
    ioErrorHandler()
}

ファイルを開いて読み取るコードは try/catch 構造で囲まれているので、I/O エラーが発生すると、ioErrorHandler() メソッドが呼び出されます。

ストリームオブジェクトの open() メソッドには、2 つのパラメータがあります。

  • 1 つ目のパラメータは、開く File オブジェクト(この場合は、アプリケーションのメインファイルオブジェクト)です。
  • 2 つ目のパラメータは、FileMode クラスのいずれかの定数(この場合は、データの書き込みが可能でファイル内の既存のデータを上書きする WRITE 定数)で定義されたファイルモードです。

try ステートメントの後の 4 行目では、TEXTAREA データ内の \n 改行文字をプラットフォーム固有の行末文字に置き換えています。行末文字は、static File.lineEnding プロパティで表されています。

outData = outData.replace(/\n/g, air.File.lineEnding);

writeUTFBytes() メソッドでは、UTF-8 テキストデータがファイルに書き込まれます。

この例では、open() メソッドを使用して、同期操作用にファイルを開いています。また、openAsync() メソッドを使用して、非同期操作用にファイルを開くこともできます。ただし、非同期操作用にファイルを開いた場合は、outputProgress イベントおよび ioError イベントを処理するようイベントリスナーを設定する必要があります。

非同期操作を使用すると、他のプロセス(グラフィカルな進行状況など)でファイルを非同期に読み書きさせることができます。

著者について

Jeff Swartzは、1992年にMacromedia(現Adobe Systems)に入社し、現在はAdobe AIR担当のテクニカルライターを務めています。Jeffは、University of Illinois at Urbana-Champaignのコンピュータサイエンス学学士号と、Edinburgh University人工知能学部での就学経験を有しています。サンフランシスコベイエリアのファンは、Jeffのトロンボーン演奏を寛大に許容しています。また、Vienna Beef Ltd.のダンシングホットドッグ、Big Frankとして活躍した経験もあります。