Как загрузить текст из файла в J2ME



Как загрузить русский текст

При разработке мидлетов, довольно часто бывает нужнозагрузить какие-нибудьданные из текстового файла в переменную. На одном из форумов поj2me программированию я наткнулся на простую реализацию метода, позволяющего считывать данные из ASCIIтекстового файла.

private StringgetText(String path){
DataInputStream dis=new DataInputStream(getClass().getResourceAsStream(path));
StringBuffer strBuff=new StringBuffer();
int ch=0;
try{
while((ch= dis.read())!=-1){
strBuff.append((char)((ch>=0xc0&amp;&amp; ch<=0xFF) ?(ch+0x350): ch));
}
dis.close();
} catch(Exception e){
System.err.println("ERROR in getText() "+ e);
}
return strBuff.toString();
}

Для того чтобы использовать этот метод, необходимо подключить кjava мидлету пакеты java.io.*. В качестве параметра методу getText передаетсяпуть к файлу. Корневой считается папка res/ вашего проекта. То есть, getText(«/book.txt») загрузит файл <Ваш проект>/res/book.txt. (Дело в том, что после сборки jar архива файлы из папки ресурсов помещаются в ту же папку, что и откомпилированные файлы классов.)

Как видите, все просто. Создается входящий поток данных dis, связанный стекстовым файлом, откуда побайтно читаются данные в строковый буфер strBuff, который потом преобразуется в строку и возвращается из метода.

Пожалуй единственным не очевидным моментом в коде метода является строчка:

strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));

Дело в том, что если использовать строчку

strBuff.append((char)ch)
 

то данные тоже будут считываться, но у нас возникнут проблемы с русскими буквами при отображении. Эта строка нужна для корректного перевода русского текста из кодировки ASCII в Unicode.

Предлагаю разобраться с принципом работы метода на простом примере. Создайте новый мидлет. Я использовал SampleMidlet каркас из статьи«Пишем софт для телефона». Давайте Создадим форму и добавим на нее StringItem, в который изагрузим текст из файла. В общем, у меня получилось следующее.

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
//Подключаепм пакет для работы с вводом/выводом
import java.io.*;
 
publicclass SampleMIDletextends MIDlet implements CommandListener{
 
private Display display;
private Form MainForm;//Форма
private StringItem StrFromTxt;//Сторка, которая будет грузиться из текстового файла
private Command CMD_EXIT=new Command("Выход", Command.EXIT,1);//Комманда выхода из мидлета
 
public SampleMIDlet(){}
 
protected void destroyApp( boolean unconditional) throws MIDletStateChangeException
{
exitApp();
}
 
protected void pauseApp(){}
 
protected void startApp() throws MIDletStateChangeException
{
if( display==null)
{
initApp();// Этот код выполняется при запуске мидлета
}
}
 
private void initApp()
{
display= Display.getDisplay( this);
MainForm=new Form("www.MobiLab.ru");//Создаем форму
MainForm.setCommandListener(this);///Ловим команды от формы
MainForm.addCommand(CMD_EXIT);//Добавляем кнопку «Выход» на панель
 
String str=getText("/book.txt");//Грузим в текстовую переменную данные из файла
 
//Создаем StringItem компонент на основе загруженного текста
StrFromTxt=new StringItem("?????: ",str);
 
MainForm.append(StrFromTxt);//Добавляем на форму компонент с текстом
display.setCurrent(MainForm);//Отображаем форму
}
 
public void exitApp()
{
notifyDestroyed();// уничтожение MIDlet-а
}
 
public void commandAction(Command c, Displayable d){
if(c== CMD_EXIT){exitApp();}//Команда "Выход"
}
 
private StringgetText(String path){
DataInputStream dis=new DataInputStream(getClass().getResourceAsStream(path));
StringBuffer strBuff=new StringBuffer();
int ch=0;
try{
while((ch= dis.read())!=-1){
strBuff.append((char)((ch>=0xc0&amp;&amp; ch<=0xFF) ?(ch+0x350): ch));
}
dis.close();
} catch(Exception e){
System.err.println("ERROR in getText() "+ e);
}
return strBuff.toString();
}
 
}

Cоздадим в папке /res/ проектатекстовый файл book.txt с каким-нибудь текстом. Все, можно запускать и тестировать приложение.

Загрузка числовых данных из файла

В своих проектах я часто использую конфигурационные файлы, куда помещаю разную текстовую и числовую информацию. Для разделения информации я использую символы-разделители (обычно '|'). Для того чтобы загрузить информацию в переменные, нужно считать ее из файла с помощью уже рассмотренного метода getText(), а затем вычленить данные выполняя поиск символов разделителей. После того как данные вычленены, их можно перевести в необходимый формат (int, double).

Рассмотрим пример. Пусть в конфигурационном файле содержится три параметра: Имя пользователя, его год рождения и вес(с точностью до грамма :) ). Создадим в папке res проектафайл config.ini с текстом

Василий|1973|86.998|

Создадим класс подобный рассмотренному Выше. Изменения коснутся только метода initApp():

private void initApp()
{
display= Display.getDisplay( this);
MainForm=new Form("www.MobiLab.ru");//Создаем форму
MainForm.setCommandListener(this);
MainForm.addCommand(CMD_EXIT);
display.setCurrent(MainForm);//Отображаем форму
//Прочитаем из текстового файла строку
String str=getText("/config.ini");//Грузим файл конфигурации в строковую переменную
 
int i0=0, i=0;
String s1;//Вспомогательная строка. (исключительно для наглядности)
 
i= str.indexOf("|",i0+1);//Ищем символ "|" в строке, начиная с i0+1 буквы
String Name=str.substring(i0,i);//Выделяем часть строки с i0 по i-ый символ
 
i0=i;
i= str.indexOf("|",i0+1);//Ищем следующий символ
s1=str.substring(i0+1,i);
int Year=(int)Integer.parseInt(s1);//Преобразуем строку в число
 
i0=i;
i= str.indexOf("|",i0+1);//Ищем следующий символ
s1=str.substring(i0+1,i);
double Weight=(double)Double.parseDouble(s1);//Преобразуем строку в вещественное число
 
StringItem SI1=new StringItem("Имя: ",Name);
StringItem SI2=new StringItem("Год: ",""+Year);
StringItem SI3=new StringItem("Вес: ",""+Weight);
MainForm.append(SI1);
MainForm.append(SI2);
MainForm.append(SI3);
}

Как видите, ничего сложного.

  1. Загружаем в i0 номер номер последнего найденного символа.
  2. С помощью метода indexOf() ищем следующий символ, начиная с i0
  3. С помощью substring вырезаем часть строки и помещаем ее в новую переменную
  4. Преобразовываем строку к необходимому нам типу
  5. возвращаемся на шаг 1





Автор:Александр Ледков (aRix).




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна