如何确定从输入流读取多少字节?

Kri*_*nya 3 java inputstream

我正在尝试从InputStream。我写了下面的代码

byte[] bytes = new byte[1024 * 32];
                while (bufferedInStream.read(bytes) != -1) {
                    bufferedOutStream.write(bytes);
                }
Run Code Online (Sandbox Code Playgroud)

我不明白,我应该在一次迭代中读取多少个字节?流包含保存在磁盘上的文件。

在这里阅读但我真的不理解该帖子。

Ang*_*ber 6

假设您有从管道到浴缸的水流。然后,您用一个水桶从浴缸中取水,然后要对您的花园说要给草坪浇水。浴是缓冲区。当您在草坪上行走时,缓冲区已装满,所以当您返回时,有一个水桶可让您再次拿起。

如果浴缸很小,那么当您带着水桶行走时,浴缸可能会溢出,因此您会流失水分。如果您的浴室很大,那么就不太可能溢出。因此更大的缓冲区更方便。但是,当然,较大的浴缸要花更多的钱,并且要占用更多的空间。

程序中的缓冲区占用了内存空间。而且,您不只是因为方便而占用了缓冲区的所有可用内存。

通常,您可以在读取功能中指定要读取的字节数。因此,即使您的缓冲区很小,也可以执行以下操作(伪代码):

const int bufsize = 50;
buf[bufsize];
unsigned read;
while ((read = is.read(buf, bufsize)) != NULL) {
   // do something with data - up to read bytes
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,bufzise是要读取到缓冲区的MAXIMUM数据。

如果您的读取功能不允许您指定要读取的最大字节数,则需要提供足够大的缓冲区以接收最大可能的读取量。

因此,最佳缓冲区大小取决于应用程序。只有应用程序开发人员才能知道数据的特征。例如,水进入浴池的速度有多快。您能负担得起什么尺寸的浴池(嵌入式应用程序),从浴池中提起水桶越过花园又能多快返回。


tal*_*lex 5

这取决于可用内存、文件大小和其他内容。你最好做一些测量。

PS:你的代码是错误的。bufferedInStream.read(bytes)可能不会填满所有缓冲区,而只能填满其中的一部分。此方法返回实际的字节数作为结果。

byte[] bytes = new byte[1024 * 32];
int size;
while ((size = bufferedInStream.read(bytes)) != -1) {
    bufferedOutStream.write(bytes, 0, size);
}
Run Code Online (Sandbox Code Playgroud)