範例:使用隨機存取權讀取和寫入資料

Adobe AIR 1.0 以及更新的版本

MP3 檔案可包含 ID3 標籤,而這些標籤位於檔案 (包含可識別歌曲的中繼資料) 開頭或結尾的區段。ID3 標籤格式本身具有不同的版本。在下列範例中,會說明如何使用「檔案資料的隨機存取權」(表示範例可以在檔案中的任意位置執行存取和寫入作業),對包含最簡單之 ID3 格式 (ID3 1.0 版) 的 MP3 檔案執行讀取和寫入作業。

包含 ID3 標籤第 1 版的 MP3 檔案在檔案結尾處 (最後的 128 位元組中) 包含 ID3 資料。

當存取檔案供隨機讀取/寫入存取時,請務必將 open()openAsync() 方法的 fileMode 參數設定為 FileMode.UPDATE

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

如此,您才可以對檔案執行讀取和寫入作業。

在開啟檔案時,您可以將 position 指標設定為檔案結尾之前 128 個位元組這個位置:

fileStr.position = file.size - 128;

上述程式碼會將 position 屬性設定為檔案中的這個位置,因為 ID3 v1.0 格式指定 ID3 標籤資料必須儲存在檔案的最後 128 個位元組中。該版本的規格也規定下列項目:

  • 標籤的前 3 個位元組必須包含 "TAG" 字串。

  • 之後的 30 個字元必須包含 MP3 歌曲的標題 (以字串表示)。

  • 之後的 30 個字元必須包含藝人的姓名 (以字串表示)。

  • 之後的 30 個字元必須包含專輯的名稱 (以字串表示)。

  • 之後的 4 個字元必須包含年份 (以字串表示)。

  • 之後的 30 個字元必須包含註解 (以字串表示)。

  • 之後 1 個位元組必須包含表示歌曲類型的代碼。

  • 所有文字資料的格式都必須是 ISO 8859-1。

id3TagRead() 方法會在資料已讀入之後 (complete 事件發生時) 檢查資料:

function id3TagRead():void 
{ 
    if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i))  
    { 
        var id3Title:String = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Artist:String = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Album:String = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3Year:String = fileStr.readMultiByte(4, "iso-8859-1"); 
        var id3Comment:String = fileStr.readMultiByte(30, "iso-8859-1"); 
        var id3GenreCode:String =  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))。