Java Scanner Weird Double Read () вызов при использовании пользовательского InputStream, который имеет модифицируемый буJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java Scanner Weird Double Read () вызов при использовании пользовательского InputStream, который имеет модифицируемый бу

Сообщение Anonymous »

Почему сканер Java делает двойные вызовы для чтения () и как я могу управлять пользовательским вводом для моделирования игры?

Я пытаюсь имитировать способ управления игровым вводом Кодингейм, который обычно выглядит так: < /p>

Код: Выделить всё

Scanner in = new Scanner(System.in);
int width = in.nextInt(); // columns in the game grid
int height = in.nextInt(); // rows in the game grid

// Game loop
while (true) {
int entityCount = in.nextInt();
// Process more input
}
Чтобы достичь этого, я создал пользовательский inputstream . Проблема состоит в том, что сканер , кажется, делает двойные вызовы в метод read () для одного вызова to nextint () .
выпуск
  • Если я возвращаю -1 дважды последовательно во время вызовов чтения () , сканер < /code> рассматривает поток как закрытый , заставляя его бросить noshelementexception .
  • для справки, я обнаружил, что возвращение фиктивного пространства символов () после -1 предотвратить помечение потока как закрытый. to nextint () , прежде чем читать больше данных из потока.
Вот мое текущее решение:

Код: Выделить всё

private class GameStream extends InputStream {

private String buffer = "";
private int position = 0;
private int playerNum;
private boolean spaceFound = false;

public GameStream(int playerNum) {
this.playerNum = playerNum;
setBuffer(getTurnData(playerNum));
}

public GameStream setBuffer(String buffer) {
this.buffer = buffer;
position = 0;
return this;
}

@Override
public int read() throws IOException {
// Stop reading until the next call to nextInt()
if (spaceFound) {
spaceFound = false;
return -1;
}
if (position < buffer.length()) {
int c = buffer.charAt(position++);
if (c == ' ') {
spaceFound = true;
}
return c;
} else {
players.get(playerNum).getHisData = true;

// Prevent Scanner from closing the stream
setBuffer(" ");
return -1;
}
}
}
Вопросы
  • Почему сканер call Read () дважды для одного Nextint () call?
  • Какой правильный способ сделать сканер ждать новых данных при вызове nextint () не прибегая к фиктивным персонажам ()?
простой код, показывающий проблему
class GameStream extends InputStream {

private String buffer = "";
private int position = 0;

public GameStream(String buffer) {
setBuffer(buffer);
}

public GameStream setBuffer(String buffer) {
this.buffer = buffer;
position = 0;
return this;
}

@Override
public int read() throws IOException {
if (position < buffer.length()) {
int c = buffer.charAt(position++);
return c;
} else {
System.out.println("player read all data");
//setBuffer("without_dummy_space_should_fail ");
return -1;
}
}
}
< /code>
Использование < /p>
GameStream gs = new GameStream("first turn finish_");
Scanner in = new Scanner(gs);
System.out.println(in.next() + " " + in.next() + " " + in.next());
gs.setBuffer("next turn_");
System.out.println(in.next()+ " " + in.next());
< /code>
out ut up < /p>
player read all data before
player read all data before
first turn finish_without_dummy_space_should_fail
player read all data before
player read all data before
next turn_without_dummy_space_should_fail
< /code>
Надеюсь, я четко объяснил свою проблему. Любое понимание будет высоко ценится!


Подробнее здесь: https://stackoverflow.com/questions/794 ... hat-has-mo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»