web-dev-qa-db-ja.com

BufferedReaderですべての行を読み取る

BufferedReaderを使用してコンソールに複数行のテキストを入力し、「Enter」を押してテキスト全体の長さの合計を見つけたい場合。問題は、無限ループに入ってしまい、Enterキーを押してもプログラムが終了しないように見えることです。私のコードは次のとおりです。

InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

    line= buffer.readLine();

    while (line!=null){
        length = length + line.length();
        line= buffer.readLine();
    }

私が間違っていることを教えてください。

20
deadpixels

すべての行を読む慣用的な方法はwhile ((line = buffer.readLine()) != null)です。また、 try-with-resourcesステートメント 。何かのようなもの

try (InputStreamReader instream = new InputStreamReader(System.in);
        BufferedReader buffer = new BufferedReader(instream)) {
    long length = 0;
    String line;
    while ((line = buffer.readLine()) != null) {
        length += line.length();
    }
    System.out.println("Read length: " + length);
} catch (Exception e) {
    e.printStackTrace();
}

空の行を受け取ったときにループを終了する場合は、whileループにループのテストを追加します

while ((line = buffer.readLine()) != null) {
    if (line.isEmpty()) {
        break;
    }
    length += line.length();
}

JLS-14.15。breakステートメント

breakステートメントは、外側のステートメントから制御を移します。

25
Elliott Frisch

Java 8:を使用した1行のコード:

line =  buffer.lines().collect(Collectors.joining());
62
Russel Yang

Enterキーを押すだけでbuffer.readLine();からの戻り値がnullではない場合、空の文字列になります。

したがって、_line != null_を!line.equals("")に変更する必要があります(line.length() > 0に変更することもできます)

これで、コードは次のようになります。

_InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

line = buffer.readLine();

while (!line.equals("")){
    length = length + line.length();
    line = buffer.readLine();
}
_

これで問題が解決するはずです。これが役に立てば幸いです! :)

4

Enterキーを押すと、lineはnullになりません。 empty文字列になります。

BufferedReader JavaDocreadLine()について言っていることに注意してください。

テキストの行を読み取ります。行は、ラインフィード( '\ n')、キャリッジリターン( '\ r')、またはキャリッジリターンとそれに続くラインフィードのいずれかで終了すると見なされます。

readLine()は以下を返します。

行の内容を含むString。行終了文字は含まれません。ストリームの終わりに達した場合はnull

[Enter]を押すと、BufferedReaderに_\n_、_\r_、または_\r\n_のみを含む新しい行が追加されます。これは、readLine()が空の文字列を返すことを意味します。

そのため、代わりに次のようなものを試してください。

_InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

line = buffer.readLine();

while( (line != null) && (!line.isEmpty()) ){
    length = length + line.length();
    line = buffer.readLine();
}
_
3
dbank

意地悪な答え:あなたが間違っているのは、Javaで何かをするために2つのオブジェクトを作成するだけです...検索すると、おそらくBufferedReaderやExtendedBufferReaderなどを拡張するクラスがさらに見つかるでしょう。 、そして実際のエンタープライズJavaにすることができます。

システムからそれを取得したので、より便利な答え。 System.inは、EOFを入力すると閉じられます。EOFはLinuxではControl-Dであり、MacOSではI think Control-Zに加えてWindowsではEnterです。エンター(または、具体的には2つのエンター...をチェックする場合、1つは最後の行を終了し、もう1つは終了したことを示します。これは、HTTPがHTTPヘッダーの終了と決定のタイミングを決定する基本的な方法です。 httpボディ、@ dbankのソリューションは、!whileではなくwhile述部内で!を移動させようとする小さな修正で、実行可能なオプションになります。

(編集#2:readLineは改行を削除するので、空行は改行ではなく ""になるため、コードはEOFビットをコメントではなく別の回答として使用します。 )

編集...それは奇妙です、私の答えを入力しているときに@dbankが答えていたので、EOFの代替案に言及していなくても停止していました。私が作るつもりでした:

InputStreamReader instream = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(instream);

    line= buffer.readLine();
    while (line != null && !line.equals("")){
        length = length + line.length();
        line= buffer.readLine();
    }
0
Foon

Java 8なので、BufferedReader#linesメソッドは、バッファ付きリーダーで直接使用します。

    try (InputStreamReader in = new InputStreamReader(System.in);
         BufferedReader buffer = new BufferedReader(in)) {
        final int length = buffer.lines().mapToInt(String::length).sum();
        System.out.println("Read length: " + length);
    } catch (Exception e) {
        e.printStackTrace();
    }
0
Grzegorz Gajos

すべての行をString []配列に入れます。 2番目のメソッドは、テキストファイルに含まれる行数を取得します。これが誰にとっても役立つことを願っています。

public static void main(String... args) throws IOException {
    String[] data = getLines();
    for(String v : data) {
        out.println(v);
    }
}

public static String[] getLines() throws IOException {
    BufferedReader bufferReader = new BufferedReader(new FileReader("C:\\testing.txt"));
    String line = bufferReader.readLine(); 
    String[] data = new String[getLinesLength()];
    int i = 0;
    while(line != null) {
        data[i] = line; 
        line = bufferReader.readLine();
        i++;
    }
    bufferReader.close();
    return data;
}

public static int getLinesLength() throws IOException {
    BufferedReader bufferReader = new BufferedReader(new FileReader("C:\\testing.txt"));
    String line = bufferReader.readLine(); 
    int size = 0;
    while(line != null) {
        size += 1;
        line = bufferReader.readLine();
    }
    bufferReader.close();
    return size;
}
0
Snow Bases