Я хочу читать и обрабатывать поток String, содержащий одиночные или несколько команд в одной строке.Чтение и обработка потоков
В настоящее время я использую InputStream in = socket.getInputStream();
для моего входного потока.
Кроме того, для обработки на вход типовой Темы:
public void run() {
String input = "";
try {
int data = 0;
while (!isInterrupted()) {
while ((data = in.read()) != -1 && !isInterrupted()) {
input += Integer.toHexString(data);
handleInput(input);
}
try {
sleep(500);
} catch (InterruptedException e) {
break;
}
}
socket.close();
return;
} catch (IOException e) {
main.log("Connection lost...");
main.log(e.toString());
main.stopBTCommunication();
main.startBTServer();
}
}
handleInput()
предназначен для обработки любой строки, данной ему и ответ правильно. Проблема с этой реализацией будет заключаться в том, что handleInput()
вызывается с каждым байтом, считанным с in.read()
. Я знаю, что я мог бы использовать BufferedReader.readLine()
, но для этого требуется, чтобы каждая команда incomming добавила к ней "\n"
, что НЕ имеет значения и не может быть изменено.
Я знаю, что
while (!isInterrupted()) {
while ((data = in.read()) != -1 && !isInterrupted()) {
является своего рода неприятностью, но в основном это хотят тему читать, пока ничего нового не будет считан, а затем обработать этот вход, а затем снова читать ...
EDIT:
Так что, в основном, мне нужен неблокирующий read()
.
EDIT2:
Как входящие команды и commandchains может выглядеть следующим образом:
- Выберите команду: "s"
- ReadLine Команда: "rlXX", когда X представляет шестнадцатеричное число
- WriteLine Команда: «wlXXSSSSSSSS», в которой X и S являются шестнадцатеричными цифрами
Таким образом, команда может выглядеть как li ка один из следующих действий:
"s"
"srlff"
="s" + "rlff"
"rlffwlbb2e2e2e2erlbb"
="s" + "rlff" + "wlbb2e2e2e2e" + "rlbb"
Итак, сколько байтов вы хотите прочитать перед вызовом handleInput? Если вы хотите не блокировать IO, для этой цели существуют классы в пакете nio. – anonymous
, пока не будет прочитано больше байтов. –
Не осталось больше байтов, пока поток не будет закрыт или что-нибудь еще доступно? Если это последний, вы можете прочитать в массиве байтов и преобразовать этот массив байтов в строку HEX, а затем вызвать handleInput(). – anonymous