web-dev-qa-db-ja.com

BufferedInputStreamで行を読み取る方法は?

BufferedInputStreamを使用してユーザーから入力を読み取るコードを書いていますが、BufferedInputStreamがバイトを読み取るので、プログラムは最初のバイトのみを読み取って出力します。最初のバイトを読み取るだけでなく、入力全体(Integerになります)を読み取り、保存、印刷できる方法はありますか?

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

18
PankajKushwaha

BufferedInputStream は、bytesの読み取りに使用されます。行の読み取りには、文字の読み取りが含まれます。

入力バイトをcharsetで定義される文字に変換する方法が必要です。したがって、バイトを文字に変換し、そこから文字を読み取ることができる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);
33
icza

これは、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();
    }
}

ただし、InputStream.read()は読み取った文字ごとにシステムコールを実行するため、このソリューションはBufferedReaderを使用するよりも非効率的です。

3
sam_eera