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();
}
私が間違っていることを教えてください。
すべての行を読む慣用的な方法は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();
}
break
ステートメントは、外側のステートメントから制御を移します。
Java 8:を使用した1行のコード:
line = buffer.lines().collect(Collectors.joining());
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();
}
_
これで問題が解決するはずです。これが役に立てば幸いです! :)
Enterキーを押すと、line
はnullになりません。 empty文字列になります。
BufferedReader
JavaDoc がreadLine()
について言っていることに注意してください。
テキストの行を読み取ります。行は、ラインフィード( '\ 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();
}
_
意地悪な答え:あなたが間違っているのは、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();
}
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();
}
すべての行を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;
}