Java:每次为同一输入运行程序时获取不同的输出

时间:2016-10-07 04:03:38

标签: java eclipse

环境:运行程序时使用的输入文件重定向,IDE:Eclipse。

我正在从System.in读取数据包(因为使用了输入重定向),并计算数据包的数量。每次运行相同输入的程序时,我得到不同的计数(全部错误)。另外,当我在控制台上显示很多东西时,我得到了正确的计数。

int packetNumber = 0;
while(System.in.available()>0)
{
    System.out.println("\n" + packetNumber + ": ");
    int numberOfBytes = System.in.read();
    byte[] buffer = new byte[numberOfBytes];
    System.in.read(buffer, 0, numberOfBytes);
    packetNumber++;
}
System.out.println("Number of packets = " + packetNumber);

使用System.out.println()可以正常工作,但没有它会表现得很奇怪

提前致谢。

1 个答案:

答案 0 :(得分:0)

填充缓冲区不需要

read(byte[] b, int off, int len)

  

将输入流中最多len个字节的数据读入一个字节数组。尝试读取len个字节,,但可以读取较小的数字。实际读取的字节数以整数形式返回。

这是因为缓冲,以及程序发送数据和本程序接收数据的性能差异,这会影响下次调用read()时缓冲区中累积的字节数。

假设每次调用read()都会返回一个“数据包”,这肯定是错误的。

如果您将返回值捕获为bytesRead并将其相加,则应始终获得相同的总数。

byte[] buffer = new byte[numberOfBytes];
int totalBytes = 0;
int bytesRead;
while ((bytesRead = System.in.read(buffer)) != -1) {
    totalBytes += bytesRead;
}
System.out.println("Received " + totalBytes + " bytes");