如果我从这样的管道获得标准输入,那就没关系。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while((input=reader.readLine())!=null)
{
...
}
但是如果我这样写我的程序,BufferedReader只能从管道获得半标准输入。管道将停在某处,但位置不确定。 而且每次我手动逐行输入。该计划很好。但如果我突然输入一千行。它只会输出第一行的结果。我之前只手动输入,所以这是我第一次遇到这个问题。我以为这两个应该是一样的。
while(true)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
if((input=reader.readLine())==null)
{
break;
}
...
}
答案 0 :(得分:1)
BufferedReader
将读取多行,因此下一次调用可以在不通过操作系统的情况下获得更多数据,从而提高性能。
如果删除BufferedReader
并创建一个新数据,则第一个实例中已存储的所有数据都将丢失。
答案 1 :(得分:0)
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input;
String completeInput = "";
while(true)
{
if((input=reader.readLine())==null)
{
break;
}
//here you need to do something with your input
//for example
completeInput+=input;
}
//here you have complete input string in complete input
答案 2 :(得分:0)
这两种编码方式之间的区别非常简单。
第一种方式:
你已经在while循环之外声明了缓冲区读取器,如下所示
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
因此对于while循环的每次迭代,它都会指向单个相同的控制台
因此它从控制台读取所有数据,因此输出正确地按预期输出
第二种方式:你已经在while循环中声明了缓冲区读取器,如下所示
while(true)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//rest of the code
}
这里每次迭代都会创建指向新控制台的新读者,因为System.in会为每个while循环迭代分配给reader。
因此,当它第一次读取时,它会读取所有行并执行else块并打印第一行,因为readLine方法一次只能获取一行。
并且在while循环的第二次迭代中,它指向新控制台,新控制台将没有任何数据,因此它会打破while循环。
但是如果你逐行逐行输入循环迭代指向新控制台,你每次都将它输入到新的控制台,因此它可以正确打印。