java - 我如何决定从输入流中读取多少字节?

标签 java inputstream

我正在尝试从 InputStream 中读取数据。我写了下面的代码

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

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

我读了here但我真的没看懂帖子。

最佳答案

假设水从管道流入浴缸。然后你用一个桶从浴缸里取水,然后带到你的花园里给草坪浇水。浴缸是缓冲器。当您穿过草坪时,缓冲区会被填满,因此当您返回时,会有一桶水供您再次使用。

如果浴缸很小,那么当您提着水桶走路时它可能会溢出,因此您会失去水。如果你有一个大浴缸,那么它就不太可能溢出来。所以更大的缓冲区更方便。但当然,更大的浴缸要花更多的钱并占用更多的空间。

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

通常在您的读取函数中,您可以指定要读取的字节数。所以即使你有一个小缓冲区,你也可以这样做(伪代码):

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

在上面的代码中,bufzise 是要读入缓冲区的最大数据。

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

因此最佳缓冲区大小是特定于应用程序的。只有应用程序开发人员会知道数据的特性。例如,水流入浴缸的速度有多快。你能买得起多大的浴缸(嵌入式应用程序),你能以多快的速度把水桶从浴缸里拿出来穿过花园再搬回来。

关于java - 我如何决定从输入流中读取多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26095918/

相关文章:

java - 如何列出实现给定接口(interface)集的类路径上的所有类

java - 返回可能已设置的实例时,DeferredResult 是否存在竞争条件?

java - 如何强制 JavaFX 应用程序中的所有按钮使用我的自定义皮肤?

java - 在读取时修改 InputStream 读取的字节,而不是稍后修改

Java InputStream 阻塞读取

java - Hibernate:带有选择的表锁?

java - 如何用 java 将文件上传到 Restful Web 服务?

java - ServerSocket可以在从客户端读取之前先写入客户端吗?

java - 来自 HttpURLConnection 的输入流 : When to disconnect?

java - 使用 InputStream 通过网络寻找流式音频的有效方法