Как читать строки в J2ME? - PullRequest
       16

Как читать строки в J2ME?

3 голосов
/ 14 октября 2008

Я использую MIDP 2.0 (JSR 118), и я только что заметил, что в J2ME нет ридера для строк.

Кто-нибудь знает, как вы должны читать строки из InputStream или InputStreamReader независимо от платформы (т.е. между двумя сотовыми телефонами с поддержкой Java разных моделей)?

Ответы [ 4 ]

5 голосов
/ 14 октября 2008

Какой профиль вы используете? В профиле MID в JSR 118 указывается InputStreamReader (не StringReader, но в любом случае это не поможет вам читать из InputStream).

РЕДАКТИРОВАТЬ: Для отражения изменений в вопросе:)

Вы используете InputStreamReader.read (char [], int, int) и, когда вы прочитали все, что хотите, создаете новую строку из массива char. Если вы хотите читать строку за раз, как если бы вы использовали BufferedReader, вам, в основном, нужно самостоятельно реализовать функциональность BufferedReader (сохраняя буфер «чтения, но не израсходованных» символов) и продолжать чтение до тех пор, пока не произойдет разрыв строки. 1007 *

3 голосов
/ 19 октября 2011

Ну ... я знаю, что это было долгое время назад.

Тебе нужно сделать именно то, что сказал Джон, и это ОЧЕНЬ просто. Мне понадобилось 5 часов, чтобы понять это в первый раз ...

Я до сих пор удивляюсь, почему j2ME не включал в себя что-то столь же важное, как метод BufferedReader для сокетов, это не значит, что чертовы мобильные телефоны с ним рухнут ... и да, я не отдам задницу крысе приложение работает на 1 мс медленнее, чем должно.

(я просто собираюсь поместить соответствующий код, я полагаю, вы знаете, как формировать классы и импортировать необходимые библиотеки)

ServerSocketConnection listener
    = (ServerSocketConnection)Connector.open("socket://:1235");
System.out.println("Waiting for connection...");
StreamConnection server = listener.acceptAndOpen();
InputStream is = server.openInputStream();

//Now comes the fake BufferedReader equivalent part

int ch = 0;
StringBuffer sb = new StringBuffer();

while ((ch = is.read()) != -1){
    sb.append((char)ch);
    if(sb.charAt(sb.length()-1) == 13 ) {
       //Carriage return was received or ENTER was pressed
       break; //Exit loop and print input
    }
}

Как видите, метод is.read() блокирует поток до получения нового ввода от пользователя ONE BYTE одновременно. Это означает, что если вы используете telnet для тестирования, каждое нажатие клавиши будет повторять цикл один раз, следовательно, мы просто объединяем символ char в символ StringBuffer до получения символа 13.

System.out.println(sb.toString());

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

3 голосов
/ 14 октября 2008

Или посмотрите на DataInputStream.readUTF().

Требуется, чтобы строка, читаемая из InputStream, была закодирована надлежащим образом (как в соответствующем DataOutputStream.writeUTF(String)), так что это может быть не то, что вы ищете - но это работает через разные телефоны / модели и т. д.

1 голос
/ 04 ноября 2008

Не могли бы вы привести пример этого?

Вы используете InputStreamReader.read(char[], int, int), и когда вы прочитали все, что хотите, создайте новую строку из массива char. Если вы хотите читать строку за раз, как если бы это было из BufferedReader, вам, в основном, нужно самостоятельно реализовать функциональность BufferedReader (сохраняя буфер «чтения, но не израсходованных» символов) и продолжать чтение до тех пор, пока не произойдет разрыв строки. .

...