Как читать строку в BufferedInputStream?
Я пишу код для чтения ввода от пользователя с помощью BufferedInputStream, но поскольку BufferedInputStream считывает байты, моя программа только считывает первый байт и печатает его.
Есть ли способ, которым я могу читать/хранить/печатать весь ввод (который будет целое), кроме всего лишь чтения первого байта?
import java.util.*;
import java.io.*;
class EnormousInputTest{
public static void main(String[] args)throws IOException {
BufferedInputStream bf = new BufferedInputStream(System.in) ;
try{
char c = (char)bf.read();
System.out.println(c);
}
finally{
bf.close();
}
}
}
Вывод:
[shadow @localhost codechef] $java EnormousInputTest
5452
5
Ответы
Ответ 1
A BufferedInputStream
используется для чтения байтов. Чтение строки включает в себя чтение символов.
Вам нужен способ преобразования входных байтов в символы, которые определяются кодировкой. Поэтому вы должны использовать Reader
, который преобразует байты в символы и из которых вы можете читать символы. BufferedReader
также имеет метод readLine()
, который читает целую строку, используйте это:
BufferedInputStream bf = new BufferedInputStream(System.in)
BufferedReader r = new BufferedReader(
new InputStreamReader(bf, StandardCharsets.UTF_8));
String line = r.readLine();
System.out.println(line);
Ответ 2
Вы можете запустить это внутри цикла while.
Попробуйте ввести код
BufferedInputStream bf = new BufferedInputStream(System.in) ;
try{
int i;
while((i = bf.read()) != -1) {
char c = (char) i;
System.out.println(c);
}
}
finally{
bf.close();
}
}
Но имейте в виду, что это решение неэффективно, чем использование BufferedReader
, поскольку InputStream.read()
делает системный вызов для каждого символа, читаемого