Єдина Країна!

Головне меню

Наша кнопка

Українські уроки про ІТ

Друзі

Підтримка української армії


Головна Програмування - Java Файловий менеджер на основі Java ME (частина 1)

Файловий менеджер на основі 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 Проголосувало )
Коментарі
Добавити новий
Залишити коментар
Ім`я:
e-mail:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Введіть цей настирливий код
Русская редакция: www.freedom-ru.net & www.joobb.ru

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 

Підписка

Хто онлайн?

Немає
На даний момент 33 гостей на сайті

Український рейтинг
TOP.TOPUA.NET