Дополнительный пакет JSR 75 дает разработчику возможность получить доступ к личной информации пользователя (адресная книга, планировщик, календарь) и файловой системе телефона, включая съемные носители информации, такие как Memory Sticks. Работа с личными данными была детально описана в статье JSR 75. Часть 1 - Personal Information Management (PIM) 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 . Важно обработать это исключение внутри мидлета.
Настоятельно рекомендуется все операции по работе с файловой системой проводить в отдельных потоках. Это предотвратит подвисания приложения.
Реализация JSR-75 на телефонах Sony Ericsson имеет некоторые ограничения:
Более подробную информацию об ограничениях можно найти в документе "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 использует 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 имеет несколько методов, которые используются для получения информации о файле и каталоге:
Более подробную информацию о JSR 75 API можно найти здесь:
Источник:JSR 75: Accessing the PIM database and File system Part one: The FileConnection API.
Перевод:aRix.