【问题标题】:InputStream using read and read(bytearray)InputStream 使用 read 和 read(bytearray)
【发布时间】:2014-12-30 09:09:25
【问题描述】:

为什么read()方法读取的总字节数不一样? 例如,

int n = System.in.read();
System.out.println("The total bytes are:"+System.in.available());

在另一个地方我们使用

byte [] in= new byte[30]; 
int n = System.in.read(byte);
System.out.println("The total bytes are:"+System.in.available());

并且两个方法中都读到了Java这个词

第一种方法的输出是:

the total bytes are 5

其中第二种方法是:

 the total bytes are 6

这两种方法在返回字节上有什么区别?

【问题讨论】:

  • 你的第二个代码 sn-p 没有编译,编辑你的问题
  • 在不被 System.in 阻塞的情况下可以读取的字节数完全取决于您提前输入了多远。

标签: java inputstream


【解决方案1】:

正如 Javadoc 所说的 available() 方法,它:“返回一个估计可以从此输入流中读取(或跳过)的字节数不阻塞下一次为此输入流调用方法。”

流确定此计数的确切方式没有严格定义。在 System.in 的情况下,它可以使用其内部缓冲区中当前可用的字节数,或者它可以将调用委托给可能依赖于实现的底层输入流(例如,由操作系统)。您可以从返回值中真正确定的唯一内容是您应该能够在不阻塞的情况下安全读取的字节数。

【讨论】:

  • BarrySW19,非常感谢您的 cmets,我也阅读了 Javadoc。实际上,问题与来自内部缓冲区的大量数据有关。使用这两种方法在很多情况下会造成混淆。
  • @MehdiAcademic2014 实际上,您只是猜测“内部缓冲区中的大量数据”是否存在,更不用说它对这个问题的影响(如果有的话)。
【解决方案2】:

System.in.read() 它从标准输入流中读取值。

byte [] in= new byte[30]; 
int n = System.in.read(byte); 
  • 它从您的 in 数组中读取值。

【讨论】:

  • atish,您的 cmets 是正确的,但为什么第一个返回 5 个字节而另一个返回 6 个字节。我知道第一个打印输出 5 个字节,因为它需要 CR,但是返回 6 个字节的 read(bytes) 呢?
  • 两者都没有返回读取的字节数 - 该方法返回仍然可以读取的最小字节数。
  • @BarrySW19 read() 方法返回它读取的字节数。 available() 方法返回可以在不阻塞的情况下读取的字节数。 它们都没有返回“仍然可以读取的最小字节数”。
  • 我不知道为什么您会看到“可以在没有阻塞的情况下读取的字节数”和“仍然可以读取的最小字节数”之间存在差异。它们显然是同一个意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多