Файловий менеджер на основі Java ME (частина 1) |
Написав admin | |||||
Четвер, 30 серпня 2012 14:55 Переглядів: 6151
|
|||||
Замість передмови Якось автора цієї статті попросили роздобути (скачати чи написати) програмку для мобільного, яка дозволяла б працювати з нотатками. Хоча я й не розумію використання таких записників (поки знайдеш ту букву, можна забути, що хотів записати), але я погодився. Піддавшись спокусі швидко розібратись з проблемою, поліз в Інтернет і нарив з десяток різних браузерів. Проте при детальнішому огляді піддослідних виявилось, що деякі не підходять по вимогам, інші зберігають створене в дивному форматі, або мають вроджену “алергію” на телефони Samsung і відмовляються запускатись взагалі. Поклавши свої надії на те, що я не дарма протираю штани на факультеті обчислювальної техніки, я вирішив написати необхідне самому. Що з того вийшло дивіться в статті та лістингах коду.
Вступ Ця стаття призначена для читачів, вже знайомих з мовою програмування Java, проте маючих невеликий досвід “спілкування” з Java ME. Не шукайте тут опису MIDP, CLDC чи механізму роботи мідлета. В статті Ви знайдете необхідне для написання власних програм з доступом до файлової системи. Створюючи браузер, ми навчимося проектувати мобільні додатки, розглянемо питання при роботі з файлами в Java ME і закладемо основи Ваших подальших розробок в цій сфері. Але досить пустих балачок, нас чекає код! Основні вимоги до браузера Ø простий інтерфейс, не перевантажений зайвою функціональністю; Ø можливість редагування текстових файлів; Ø архітектура, що надає можливість легко вносити зміни. File Connection API Відразу Вас налякаю – в основі нашого менеджеру лежатиме технологія, що описується словосполученням JSR-75 File Connection API (далі – FC API). Ця технологія фактично є Java пакетом і забезпечує нас класами для роботи з файловою системою. Якось в інструкції до ліфту було знайдено таку фразу: “Перш ніж заходити в кабіну, переконайтесь, що вона знаходиться перед Вами”. Отож, потрібно перевірити чи може телефон працювати з FC API. Тому пишемо таке: Лістинг 1. System.getProperty(“microedition.io.file.FileConnection.version”); Якщо виклик цього методу поверне нам не null, отже робота з FC API на цьому телефоні підтримується. В основі всього API покладено інтерфейс FileConnection, що виконує обов’язки класу File в Java SE. Лістинг 2 демонструє відкриття FileConnection для роботи. Лістинг 2. try { // String folderName, fileName FileConnection fc = (FileConnection)Connector.open( "file:///" + folderName + fileName); // another commands fc.close(); } catch (IOException ioe) {}
Цей коротенький шматочок коду показує як створити FileConnection за допомогою шляху, що зберігається в змінній типу String. Варто відмітити, що FileConnection може вказувати як на файл, так і на директорію, хоча шлях мусить починатися з “file:///”. Щоб створити коректний шлях необхідно знати, який символ служить розділювачом у Вашому телефоні. Найчастіше це “/”, проте дізнатись це можна так: Лістинг 3. System.getProperty(“file.separator”);
Після того, як з файлом було встановлено зв’язок, з ним можна робити купу різних потрібних та не дуже речей. Наступні методи будуть використані в нашому браузері: Ø lastModified() – дата і час останнього модифікування в форматі long; Ø fileSize() та directorySize(boolean includeSubDirs) – розмір в байтах; Ø canRead(), canWrite(), isHidden() і setReadable(boolean readable), setWritable(boolean writable), setHidden(boolean hidden) – методи для керування атрибутами “для читання”, “для запису”, “схований”; Ø create(), mkdir(), delete() – створити файл, створити папку, видалити жертву; Ø exists() – перевірити чи існує файл; Ø list() та list(String filter, boolean includeHidden) – отримати вміст папки. Але досі ми не розглянули основного – читання та запису файлів! Для цього зверніться до лістингів 4 та 6. Лістинг 4. try { // String folderName, filename, encoding FileConnection fc = (FileConnection)Connector.open( "file:///" + folderName + fileName); if (!fc.exists()) { throw new IOException(“File does not exist!”); } InputStream fis = fc.openInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int c = 0; while ((c = is.read()) != -1) { baos.write(c); } byte data[] = baos.toByteArray(); baos.close(); is.close(); fc.close(); String file = new String(data, 0, data.length, encoding); } catch (IOException ioe) {}
Тут необхідно зробити декілька уточнень: ми відкриваємо FileConnection, перевіряємо чи існує файл та читаємо його, доки не буде досягнуто кінця файлу, тобто -1. На перший погляд може здатися незрозумілим використання ByteArrayOutputStream. Проте якщо Ви будете відкривати файли, що міститимуть кирилицю, це просто необхідно! Уважний читач вже помітив, що ми переводимо файл в байти, з яких потім (знаючи кодування файлу) формуємо змінну String. Адже все це можна зробити і як показано в лістингу 5. Лістинг 5. // code byte c = 0; String file = null; while ((c = fis.read()) != -1) { file += (char) c; //!!! } //code Помилка тут – приведення прочитаного байту до char. Адже при цьому значення байтів будуть просто скопійовані в символи, а не перекодовані! Тому при відображенні на місці символів кирилиці Вас вже чекатимуть крякозябли :). Отже вірний код наведено в лістингу 4, а ми вирушимо далі (не забувши викликати методи закриття всіх використаних потоків). Наступний лістинг покаже як зберігати файли: Лістинг 6. // String data, encoding, folderName, fileName byte[] dataBytes = data.getBytes(encoding); try { FileConnection fc = (FileConnection) Connector.open( "file:///" + folderName + fileName); if (fc.exists()) { fc.delete(); } fc.create(); OutputStream os = fc.openOutputStream(); os.write(dataBytes); os.close(); fc.close(); } catch (IOException ioe) {} Тут теж не все гладко. Але все по порядку. Маючи в змінній data інформацію для запису, а в encoding – кодування, ми отримуємо байти для запису. Потім відкриваємо FileConnection і… Стоп. А для чого видаляти файл? Тут і сховався один маленький нюанс, що трішки попсував мені нерви при відладці. Запис у файл відбувається побайтово і, якщо він завершиться раніше, ніж буде досягнуто кінця старого файлу, то “хвостик” з символів старого файлу нікуди не зникне! Тому перед записом у вже існуючий файл, його необхідно очистити, або просто перестворити. Ну а далі все просто – створюємо вихідний потік, виконуємо запис і вивільняємо зайняті потокові ресурси. Ми познайомились з основами нашого браузера. Тепер я пропоную Вам безпосередньо зайнятися його розробкою.
Продовження статті - Файловий менеджер на основі Java ME (частина 2) ! Автор даного уроку - Рудницький Мирослав. ( 3 Проголосувало ) Новіші матеріали:
3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved." |