Пример: чтение и запись данных со случайным доступом

Adobe AIR 1.0 и более новых версий

MP3-файлы могут содержать теги ID3 — сегменты в начале или в конце файла, хранящие метаинформацию о записи. Существует несколько версий формата тегов ID3. В этом примере показано, как читать и записывать данные в MP3-файл с тегами ID3 самого простого формата (ID3 версии 1.0), используя функцию случайного доступа к данным файла. Это означает, что чтение и запись производятся в произвольные положения в файле.

В MP3-файле с тегами ID3 версии 1 данные ID3 содержатся в последних 128 байтах файла.

При случайном доступе к файлу для чтения и записи важно указать FileMode.UPDATE в качестве параметра fileMode метода open() или openAsync():

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 версии 1.0 подразумевает, что теги ID3 хранятся в последних 128 байтах файла. Кроме того, в спецификации выдвигается еще ряд требований. Они приведены ниже:

  • Первые 3 байта тегов содержат строку "TAG".

  • Следующие 30 символов содержат название MP3-дорожки в формате строки.

  • Следующие 30 символов содержат имя исполнителя в строковом формате.

  • Следующие 30 символов содержат название альбома в строковом формате.

  • Следующие 4 символа содержат год выпуска в строковом формате.

  • Следующие 30 символов содержат комментарии в строковом формате.

  • Следующий байт содержит код, определяющий жанр композиции.

  • Все текстовые данные кодируются в формат 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)).