例:ランダムアクセスによるデータの読み取りと書き込み

Adobe AIR 1.0 およびそれ以降

MP3 ファイルには、ID3 タグが含まれている場合があります。これは、記録した内容を識別するメタデータが格納された、ファイルの先頭または末尾にあるセクションです。ID3 タグ形式自体、様々なリビジョンがあります。この例では、最も単純な ID3 形式(ID3 バージョン 1.0)を含む MP3 ファイルを、「ファイルデータのランダムアクセス」を使用して読み書きする(つまり、ファイル内の任意の位置で読み書きを行う)方法を示します。

ID3 バージョン 1 のタグを含む MP3 ファイルでは、ファイルの末尾(最後の 128 バイト)に ID3 データが格納されています。

ランダムアクセスで読み書きを行うためにファイルにアクセスする場合、 open() メソッドまたは openAsync() メソッドの fileMode パラメーターとして FileMode.UPDATE を指定することが重要です。

var file = air.File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3"); 
var fileStr = new air.FileStream(); 
fileStr.open(file, air.FileMode.UPDATE);

これにより、ファイルに対する読み取りと書き込みの両方が可能になります。

ファイルを開いたら、次のようにして position ポインターをファイルの末尾から 128 バイトの位置に設定できます。

fileStr.position = file.size - 128;

このコードで position プロパティをファイル内のこの位置に設定する理由は、ID3 v1.0 形式では ID3 タグデータをファイルの末尾 128 バイトに格納するように決められているからです。仕様ではさらに、次のように決められています。

  • タグの最初の 3 バイトには、ストリング「 TAG 」を記述する。

  • 次の 30 文字には、MP3 トラックのタイトルをストリングで記述する。

  • 次の 30 文字には、アーティストの名前をストリングで記述する。

  • 次の 30 文字には、アルバムの名前をストリングで記述する。

  • 次の 4 文字には、年をストリングで記述する。

  • 次の 30 文字には、コメントをストリングで記述する。

  • 次のバイトには、トラックのジャンルを示すコードを記述する。

  • テキストデータはすべて ISO 8859-1 形式にする。

id3TagRead() メソッドで、読み取り後( complete イベント後)にデータを確認します。

function id3TagRead() 
{ 
    if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i))  
    { 
        var id3Title = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Artist = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Album = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Year = fileStr.readMultiByte(4, "iso-8859-1"); 
        var id3Comment = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3GenreCode =  fileStr.readByte().toString(10); 
    } 
}

ファイルへの書き込みもランダムアクセスで実行できます。例えば、 id3Title 変数を解析して(String クラスのメソッドで)大文字小文字が正しいかを確認した後で、次のように、変更後のストリング( newTitle )をファイルに書き込むことができます。

fileStr.position = file.length - 125;    // 128 - 3 
fileStr.writeMultiByte(newTitle, "iso-8859-1");

ID3 バージョン 1 の規格に準拠するには、 newTitle のストリングの長さが 30 文字になるように、末尾を文字コード 0 ( String.fromCharCode(0) )で埋める必要があります。