inputstream.read在java中读取了多少数据

时间:2017-08-23 11:06:30

标签: java inputstream

我正在研究输入流对象的read方法的定义,我很困惑每次读取多少数据,因为它说“读取一些字节”

public int read(byte[] b)
         throws IOException
Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.

假设我有一个大小为200的缓冲区数组,输入流中的数据为100字节。是否保证inputStream.read获取所有100个字节?

4 个答案:

答案 0 :(得分:2)

此接口的全部要点(或准确地说:抽象类):您可以绝对不依赖假设读取了多少字节。您始终始终必须检查该方法的返回值。

背景:此接口有许多不同的实现。一些我的缓冲区,有些可能没有。有些读取“固定”输入(可能来自内存中的现有数据)。有人可能会决定给你一个转向互联网的流,下载一个10 GB的文件,然后开始向你发送一个字节。

你唯一知道的是:方法返回

  

读入缓冲区的总字节数

故事结束。

答案 1 :(得分:1)

虽然没有在从InputStream和具体实现(参见throws IOException部分)读取时得到保证,是的,如果你有一个大小大于读取数据后,应将所有数据读入缓冲区,并且不会写入缓冲区中剩余的byte,因此保持默认原始值0

InputStreamOutputStream进行管道传输时,这也是一个警告。

read方法在流结束时返回byte读取的数量或-1

这表示您需要为“精确副本”编写多少缓冲区。

文档here

答案 2 :(得分:1)

InputStream抽象类(不是“对象”)。因此,它只指定接口,而不是实现,因此实现细节取决于您使用的实际非抽象子类。

答案 3 :(得分:1)

没有。没有保证。 read(byte b[])只需委托read方法,其中包含三个参数read(byte b[], int off, int len),如下所示:

return read(b, 0, b.length);

该方法的文档内容如下:

  

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