Java BufferedReader не сообщает о готовности, когда он содержит ">" - PullRequest
1 голос
/ 14 июля 2010

Я пытался задать этот вопрос ранее, но мне было неясно в моем вопросе. Действие Java BufferedReader над символом?

Вот моя проблема .. У меня установлен BufferedReader для чтения с устройства. Хорошо читает. У меня установлено

if (Status.reader.ready()) {
    Lines = Status.reader.readLine();
}
if (Lines.contains(">")) {
    log.level1("ready to send data")
}

Буферный ридер не сообщает >, пока я не отправлю больше данных на устройство. Проблема в том, что, когда читатель содержит >, он не готов к отчету. Он удерживается на >, пока я не введу больше данных.

Я попробовал следующее, и ничего не возвращается. Он даже не возвращает log.level0 ()

Lines = ""

try {
    Lines = Status.reader.readLine();
} catch (IOException e) {
    Log.level0("Attempted to read blank line");
}

Вот фактические отправленные данные:

^M^M01 02 F3^M00 01 F3 3E^M>

Но BufferedReader игнорирует > до тех пор, пока не будет отправлено больше данных, а затем получит такой результат:

>0102

Когда я проверяю фактические данные с устройства из командной строки, он возвращает то, что я ожидал, присутствует >.

BufferedReader не выдаст мне >. Можно ли как-нибудь проверить этот символ в противном случае?

Ответы [ 3 ]

5 голосов
/ 14 июля 2010

Метод BufferedReader.readLine() считывает данные по строке за раз. Таким образом, он будет пытаться читать символы до тех пор, пока не увидит последовательность конца строки (например, "\ n", "\ r" или "\ r \ n") или конец потока.

Если ваши входные данные не ориентированы на строки, то вам не следует использовать readLine() для их чтения. Я предлагаю вам сделать свою собственную запись / извлечение сообщения; например,

BufferedReader br = ...
StringBuilder sb = new StringBuilder(...);
int ch = br.read();
while (ch != -1 && ch != '>') {
    sb.append((char) ch);
    ch = br.read();
}
String record = sb.toString();
1 голос
/ 14 июля 2010

Проверьте это: http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/io/BufferedReader.html

Я рекомендую вместо этого использовать функцию public int read ().

В Google вы можете найти много примеров1

0 голосов
/ 14 июля 2010

С этими F3 мне кажется, что ваши данные даже не ориентированы на символы, не говоря уже о линейных. Действительно ли ваше устройство поддерживает Unicode?

Я бы использовал BufferedInputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...