JSR 75. Часть 2 - Работа с файловой системой телефона

Знакомство с ограничениями FileConnection API

Поскольку доступ к файловой системе является потенциально опасной операцией, при обращении к ней каждый раз будет запрашиваться подтверждение пользователя. Конечно, необходимость подтверждать каждое обращение мидлета очень раздражает. Однако, если мидлет подписан, то моно один раз подтвердить правомерность доступа к файловой системе и забыть об этой проблеме. Для того чтобы сделать это, нужно установить соответствующую blanket(общую) опцию в настройках прав мидлета. При распространении программного обеспечения, использующего jsr-75, очень важно объяснить пользователю, как это можно сделать.

Для телефонов Sony Ericsson эту опцию можно установить следующим образом: выделите свой мидлет и нажмите кнопку "more" (левая софт-клавиша). В открывшемся меню выберите пункт "permissions". Если Ваш мидлет подписан, Вы сможете установить опцию "blanket".

FileConnection API определяет два вида прав доступа к файлам:

javax.microedition.io.Connector.file.read

javax.microedition.io.Connector.file.write

read позволяет открыть файл в режиме чтения, либо создать InputStream на основании объекта FileConnection. write позволяет открыть файл в режиме записи, либо создать OutputStream на основании FileConnection объекта. Также write позволяет выполнять операции удаления и переименования файлов.

Если Вы не имеете прав на проведение операций чтения или записи, будет сгенерирована исключительная ситуация SecurityException . Важно обработать это исключение внутри мидлета.

Настоятельно рекомендуется все операции по работе с файловой системой проводить в отдельных потоках. Это предотвратит подвисания приложения.

Особенности спецификации Sony Ericsson

Реализация JSR-75 на телефонах Sony Ericsson имеет некоторые ограничения:

  • Вы не можете получить доступ к папкам Games и Themes.
  • Файлы и каталоги чувствительны к регистру.
  • Длина пути ограничена 120 символами.

Более подробную информацию об ограничениях можно найти в документе "Sony Ericsson Java ME Platform Developers' Guidelines, page 42".

Свойства системы

Убедиться в том, что система поддерживает FileConnection API, можно выполнив команду:

System.getProperty("microedition.io.file.FileConnection.version");

Если FileConnection API поддерживается, то она вернет "1.0".

Классы и интерфейсы FileConnection API

FileConnection API дает возможность создавать и удалять файлы и папки, получать список файлов в папке, устанавливать права, получать информацию о файлах и выполнять операции ввода-вывода. Ниже приведены важнейшие классы и интерфейсы:

  • ConnectionClosedException возникает если метод вызывает FileConnection в то время как соединение разорвано.
  • Класс FileSystemRegistry -главный системный реестр. С его помощью можно получить список примонтированных корневых папок (метод listRoots()). Он также содержит методы для регистрации "слушателей", которые оповещаются в случае добавления или удаления файловой системы в течение выполнения программы.
  • FileSystemListener - интерфейс, используемый для получения уведомлений о создании и удалении корневых файловых систем.
  • FileConnection - интерфейс, который используется для доступа к файлам и каталогам устройства. Он является расширением интерфейса Connection и содержит ряд методов для работы с файлами и папками.

Использование FileConnection API

Поскольку для работы с файловой системой FileConnection API использует Generic Connection Framework, процедура создания FileConnection похожа на создание простого GCF соединения. Единственным отличием будет указание URL адреса. Для создания FileConnection, используйте метод open класса Connector:

Connector.open(string URL);

URL адрес должен иметь вид: "file://localhost/c:/" или "file:///c:/" для внутренней памяти устройства; и "file://localhost/c:/" или "file:///e:/" для съемных карт памяти.

Так, для получения доступа к папкам внутренней памяти устройства, нужно создать FileConnection объект, используя следующий URL:

FileConnection fc = (FileConnection)Connector.open("file:///c:/");

Поскольку метод Connector.open() не позволяет указать права доступа, созданный FileConnection объект может выполнять как операции чтения, так и записи.

Указанный при создании объекта FileConnection URL может ссылаться на несуществующий файл или каталог.

Не забывайте закрывать FileConnection после выполнения всех необходимых действий:

fc.close();

FileConnection ссылающийся на несуществующий файл не может использовать многие операции. Так попытка открыть InputStream или OutPutStream приведут к возникновению java.io.IOException исключительной ситуации. Единственное, чем Вы можете воспользоваться, это методы create() и mkdir() создающие файл и каталог соответственно. Для того чтобы убедиться в существовании требуемого файла, воспользуйтесь методом exists():

fc.exists();

Если запрашиваемый файл не существует, Вы легко можете создать его:

fc.create();

Для создания каталога используется другой метод

fc.mkdir();

Для удаления файлов и каталогов используется метод

fc.delete();

чтобы узнать содержание папки, на которую ссылается объект FileConnection, используйте следующий код:

Enumeration e = fc.list();
while (e.hasMoreElements())
{
 System.out.println(((String)e.nextElement()));
}

В результате будут выведены все файлы и папки, содержащиеся в указанном каталоге. В конце названий папок будет стоять символ "/". Вы можете получить информацию об содержании папки и другим, более продвинутым способом.

list(String filter, boolean includeHidden)

Этот метод возвращает контент, удовлетворяющий условиям фильтра. Приведем простейший пример фильтра. Получим список mp3 файлов, содержащихся в папке: "*.mp3". Второй параметр указывает, должны ли отображаться файлы, помеченные как скрытые. Этот метод возвращает папки и файлы в произвольном порядке. Вы должны самостоятельно позаботиться об их сортировке.

FileSystemRegistry имеет метод listRoots(), который позволяет получить список всех примонтированных корневых файловых систем. Список возвращается как Enumeration

Enumeration e = FileSystemRegistry.listRoots();
while (e.hasMoreElements()) {
            String rootName = (String)e.nextElement();
 System.out.println("
mounted root:"+rootName);
 }

Операции ввода/вывода

Если Вам уже приходилось работать с GCF, то вы хорошо знакомы с операциями чтения и записи в файл. Для записи необходимо получить OutputStream с помощью объекта FileConnection, указывающего на необходимый файл:

OutputStream os = fc.openOutputStream()
os.write(new String("hello").getBytes());
os.close();

Если вы хотите писать в файлы данные в форме какого-нибудь Java типа, можете воспользоваться объектом DataOutputStream:

int i = 1234;
DataOutputStream ds = fc. openDataOutputStream();

ds.writeInt(i);
ds.close();

Для чтения из файла необходимо получить InputStream или DataInputStream.

byte[] b = new byte[1024];
InputStream is = fc.openInputStream();
is.read(b);
is.close();

Получение информации о файлах и каталогах

класс FileConnection имеет несколько методов, которые используются для получения информации о файле и каталоге:

  • boolean canRead() - доступен ли файл для чтения.
  • boolean canWrite() - доступен ли файл для записи.
  • long directorySize(boolean includeSubDirs) - возвращает размер всех файлов находящихся в папке (в байтах).
  • long fileSize() - возвращает размер файла в байтах.
  • long lastModified() - возвращает дату последней модификации файла или каталога.

Другие источники информации

Более подробную информацию о JSR 75 API можно найти здесь:


Источник: JSR 75: Accessing the PIM database and File system Part one: The FileConnection API.

Перевод: aRix.

Материал предоставлен сайтом www.MobiLab.ru