JSR 75

Знайомство з обмеженнями FileConnection API

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

FileConnection API визначає два види прав доступу до файлів:

read дозволяє відкрити файл як читання, чи створити InputStream виходячи з об'єкта FileConnection. write дозволяє відкрити файл у режимі запису, або створити OutputStream на основі FileConnection об'єкта. Також write дозволяє виконувати операції видалення та перейменування файлів.

Якщо Ви не маєте прав на проведення операцій читання або запису, буде згенеровано виняткову ситуацію SecurityException . Важливо обробити цей виняток усередині мідлета.

Настійно рекомендується всі операції по роботі з файловою системою проводити окремі потоки. Це запобігає підвисанню програми.

Особливості специфікації Sony Ericsson

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

Докладнішу інформацію про обмеження можна знайти у документі "Sony Ericsson Java ME Platform Developers' Guidelines, page 42".

Властивості системи

Переконатись у тому, що система підтримуєFileConnection API можна виконати команду:

Якщо FileConnection API підтримується, вона поверне "1.0".

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

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

  • ConnectionClosedException виникає якщо метод викликає FileConnection в той час, як з'єднання розірвано.
  • Клас FileSystemRegistry – головний системний реєстр. З його допомогою можна отримати перелік примонтованих кореневих папок (метод listRoots()). Він також містить методи для реєстрації слухачів, які сповіщаються у разі додавання або видалення файлової системи протягом виконання програми.
  • FileSystemListener - інтерфейс, що використовується для отримання повідомлень про створення та видалення кореневих файлових систем.
  • FileConnection - інтерфейс, який використовується для доступу до файлів та каталогів пристрою. Він є розширенням інтерфейсу Connection і містить низку методів для роботи з файлами та папками.

Використання FileConnection API

Так, щоб отримати доступ до папок внутрішньої пам'яті пристрою, потрібно створити FileConnection об'єкт, використовуючи наступну URL:

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

Оскільки метод Connector.open() не дозволяє вказати права доступу, створений об'єкт FileConnection може виконувати як операції читання, так і записи.

Вказана під час створення об'єкта FileConnection URL може посилатися на неіснуючий файл або каталог.

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

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

Якщо запитуваний файл не існує, Ви можете легко створити його:

Для створення каталогу використовується інший метод

Для видалення файлів та каталогів використовується метод

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();

Для читання файлу необхідно отримати 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 можна знайти тут: