У меня есть данные теста:
public class InputTest {
@Before
public void setUp() throws Exception {
ByteArrayInputStream in = new ByteArrayInputStream("90 22 11 4 5\n".getBytes());
System.setIn(in);
}
и мне нужно прочитать каждую цифру из InputStream как целое число. Я создаю этот тест:
@Test
public void read() throws IOException {
int c;
while ((c = System.in.read()) != '\n') {
int i = readInt(c);
if (i != -1)
System.out.print(i);
}
}
private static int readInt(int c) {
int ret = 0;
if (c >= '0' && c <= '9') {
return ret * 10 + c - '0';
}
return -1;
}
И у меня есть такой вывод: 90221145
- я печатаю каждый int на консоль. Но мне нужны отдельные цифры, как в исходной строке - 90 22 11 4 5
Я могу изменить его на:
@Test
public void read() throws IOException {
int c;
StringBuilder b = new StringBuilder();
while ((c = System.in.read()) != '\n') {
int i = readInt(c);
if (i != -1) {
b.append(i);
}else {
b.append(" ");
}
}
System.out.println(b.toString());
}
private static int readInt(int c) {
int ret = 0;
if (c >= '0' && c <= '9') {
return ret * 10 + c - '0';
}
return -1;
}
Но я не хочу создавать StringBuilder на каждом шаге. Как я могу это сделать?
P.S Я знаю о BufferedReader's readLine()
методе и StringTokinizer
, и это не подходит. Мне нужно прочитать байты. Я решаю проблемы с хранением этих данных и мне нужно только быстрое чтение.
Это пример задачи интервью, и мне нужно прочитать большой массив значений с ограничениями памяти.