понедельник, 24 августа 2009 г.

J2ME вообще для людей?

Попробовал опять начать программировать под J2ME. И столкнулся с прямо таки непреодолимыми проблемами. Тут и нехватка стандартных классов, и кривость виртуальной машины, и глюки эмулятора от SonyEricsson.

1. Построчное чтение файла

Каково же было моё удивление, когда я обнаружил, что ни один из стандартных классов ввода/вывода не позволяет построчно считывать и записывать файлы. Мне, например, удобно хранить списки карт/ресурсов/монстров в текстовом файле построчно. Что же делать? Помнится, пару лет назад писал функцию, считывающую текстовик целиком и делящую его на строки. На выходе получался массив String-ов. Да, знаю - я был извращенцем.

Вот новый код:

import java.io.*;

public class InputStreamTextReader extends InputStreamReader
{
protected InputStream is;

public InputStreamTextReader(InputStream is_)
{
super(is_); is = is_;
}

public InputStreamTextReader(InputStream is_, String enc_)
throws UnsupportedEncodingException
{
super(is_, enc_); is = is_;
}

public String readLine()
throws IOException
{
String str = "";
while (true)
{
int ch = is.read();
switch (ch)
{
case -1: return ((str.length() > 0) ? str : null);
case 13: return str;
case 10: if (str.length() == 0) continue;
}
str += String.valueOf((char)ch);
}
}
}

Подсветка синтаксиса выполнена при помощи Notepad++


Кстати говоря, этот перл в InputStreamReader меня вообще убил:
private Reader in;
Почему он не protected? Как так можно? Что уже говорить о том что ни один и стандартных классов не работает с методами mark/reset. Чтобы вернуться в начало файла - нужно переоткрыть поток, а значит породить вопрос к пользователю. Или написать свой класс, буферизующий поток. Это бессмысленно! Как сделать нормальное чтение "больших" текстовиков?

2. Утечки памяти в элементах стандартного GUI

Вот мой вопрос на Google ВиО по этому поводу. Там я исчерпывающе описал в чём я вижу проблему. Может это конечно эмулятор глючит, но сомневаюсь.

Попробовал Lightweight User Interface Toolkit 1.2 от Sun(хотя, теперь уже трудно сказать чья она) - те же яйца, только в профиль. Он конечно по моднее будет: лэйауты появлись и прочие прибамбасы . . . А с памятью всё также не аккуратен. Эх, жаль Qt для j2me не сделали. Кстати, Qt Jambi будет поддерживаться компанией Nokia лишь до мая 2010.

1 комментарий:

Анонимный комментирует...

str += String.valueOf((char)ch) крайне неэффективная инструкция.

Вместо String внутри метода readLine() лучше было бы использовать StringBuffer.append() или char[].