为什么我的程序只能获得管道标准输入的一半?

时间:2014-05-12 11:06:07

标签: java

如果我从这样的管道获得标准输入,那就没关系。

   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;
            }
                 ...
        }

3 个答案:

答案 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循环。

但是如果你逐行逐行输入循环迭代指向新控制台,你每次都将它输入到新的控制台,因此它可以正确打印。