Как читать строку в 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() делает системный вызов для каждого символа, читаемого