使用 BufferedReader 读取所有行
Read all lines with 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();
}
你能告诉我我做错了什么吗?
line
回车时不会为空;它将是一个 空 字符串。
记下 BufferedReader
JavaDoc 关于 readLine()
的内容:
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
和readLine()
returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
因此,当您按 [Enter] 键时,您为 BufferedReader
提供了一个仅包含 \n
、\r
或 \r\n
的新行。这意味着 readLine()
将 return 一个空字符串。
所以尝试这样的事情:
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 objects 来做某事...如果你搜索,你可能会找到更多 类 扩展 BufferedReader 或 ExtendedBufferReader 等,然后它可以是真正的企业 Java.
现在我已经从我的系统中得到了:更有用的答案。 System.in输入EOF时关闭,在Linux下是Control-D我觉得是MacOS,我觉得Control-Z加回车在 Windows 下。如果你想检查输入(或者更具体地说,两个输入...一个完成最后一行,一个表示你已经完成,这基本上是 http 处理确定 http headers 何时完成的方式现在是 http body 的时候了,那么 @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();
}
阅读所有行的惯用方法是while ((line = buffer.readLine()) != null)
。另外,我建议 try-with-resources
statement。像
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. The break
Statement 说
A break
statement transfers control out of an enclosing statement.
当您仅按 Enter 时,buffer.readLine();
中的 return 不是空字符串。
所以你应该把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();
}
这应该可以解决您的问题。希望这有帮助! :)
从 Java 8 开始,您可以直接在缓冲 reader.
上使用 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();
}
一行代码使用 Java 8:
line = buffer.lines().collect(Collectors.joining());
将每一行放入String[] 数组。第二种方法获取文本文件中包含的行数。我希望这对任何人都有用..
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;
}
来自@Russel Yang () 的好例子。
使用这段代码,在每行之后添加一个换行符。
String lines = bufferedReader.lines().map(line -> line + "\n").collect(Collectors.joining());
我想使用 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();
}
你能告诉我我做错了什么吗?
line
回车时不会为空;它将是一个 空 字符串。
记下 BufferedReader
JavaDoc 关于 readLine()
的内容:
Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.
和readLine()
returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
因此,当您按 [Enter] 键时,您为 BufferedReader
提供了一个仅包含 \n
、\r
或 \r\n
的新行。这意味着 readLine()
将 return 一个空字符串。
所以尝试这样的事情:
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 objects 来做某事...如果你搜索,你可能会找到更多 类 扩展 BufferedReader 或 ExtendedBufferReader 等,然后它可以是真正的企业 Java.
现在我已经从我的系统中得到了:更有用的答案。 System.in输入EOF时关闭,在Linux下是Control-D我觉得是MacOS,我觉得Control-Z加回车在 Windows 下。如果你想检查输入(或者更具体地说,两个输入...一个完成最后一行,一个表示你已经完成,这基本上是 http 处理确定 http headers 何时完成的方式现在是 http body 的时候了,那么 @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();
}
阅读所有行的惯用方法是while ((line = buffer.readLine()) != null)
。另外,我建议 try-with-resources
statement。像
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. The break
Statement 说
A
break
statement transfers control out of an enclosing statement.
当您仅按 Enter 时,buffer.readLine();
中的 return 不是空字符串。
所以你应该把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();
}
这应该可以解决您的问题。希望这有帮助! :)
从 Java 8 开始,您可以直接在缓冲 reader.
上使用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();
}
一行代码使用 Java 8:
line = buffer.lines().collect(Collectors.joining());
将每一行放入String[] 数组。第二种方法获取文本文件中包含的行数。我希望这对任何人都有用..
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;
}
来自@Russel Yang (
使用这段代码,在每行之后添加一个换行符。
String lines = bufferedReader.lines().map(line -> line + "\n").collect(Collectors.joining());