Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

РЕДАКТИРОВАТЬ:Чтобы отразить изменение вопроса :)

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

Хорошо...Я знаю, что это было ДАВНО.

Вам нужно сделать именно то, что сказал Джон, и это ОЧЕНЬ просто.Мне потребовалось почти 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() метод будет блокировать поток до тех пор, пока от пользователя не будет получен новый ввод ПО ОДНОМУ БАЙТУ ЗА РАЗ.Это означает, что если вы используете telnet для тестирования, каждое нажатие клавиши заставит цикл повторяться один раз, следовательно, мы просто объединяем символы за символами в StringBuffer до тех пор, пока не будет получен символ 13.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top