Во-первых, метод available()
не является надежным способом определить, исчерпан ли поток.Надежное указание конца потока - проверка возвращаемого значения метода read()
(<0 означает конец потока). </p>
Короче говоря, available()
может вернуть false
(который завершит цикл), если поток на мгновение пуст.Если канал все еще активен, эта ситуация изменится, как только процесс на другом конце канала запишет в него несколько байтов.Чтобы быть уверенным, что все данные прочитаны, вам нужно проверить конец потока.
Во-вторых, если вы хотите прочитать символы (и объединить их в строку), вы должны прочитать символы из Читатель (а не байты из потока).Это позволит вашему коду обрабатывать символы Юникода.
В-третьих, конкатенация больших кусков символов будет быстрее, если вы используете StringBuilder (вместо простой строки).
Наконец, если вам нужно только прочитать байты, вы можете напрямую использовать поток ввода (не нужно оборачивать его DataInputStream).
Вот как я бы написал:
Reader r = new InputStreamReader(System.in);
StringBuilder sb = new StringBuilder();
while(true) {
int ch = r.read();
if(ch < 0)
break;
sb.append((char) ch);
}
System.out.println(sb.toString());