我正在尝试从InputStream。我写了下面的代码
byte[] bytes = new byte[1024 * 32];
while (bufferedInStream.read(bytes) != -1) {
bufferedOutStream.write(bytes);
}
Run Code Online (Sandbox Code Playgroud)
我不明白,我应该在一次迭代中读取多少个字节?流包含保存在磁盘上的文件。
假设您有从管道到浴缸的水流。然后,您用一个水桶从浴缸中取水,然后要对您的花园说要给草坪浇水。浴是缓冲区。当您在草坪上行走时,缓冲区已装满,所以当您返回时,有一个水桶可让您再次拿起。
如果浴缸很小,那么当您带着水桶行走时,浴缸可能会溢出,因此您会流失水分。如果您的浴室很大,那么就不太可能溢出。因此更大的缓冲区更方便。但是,当然,较大的浴缸要花更多的钱,并且要占用更多的空间。
程序中的缓冲区占用了内存空间。而且,您不只是因为方便而占用了缓冲区的所有可用内存。
通常,您可以在读取功能中指定要读取的字节数。因此,即使您的缓冲区很小,也可以执行以下操作(伪代码):
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数据。
如果您的读取功能不允许您指定要读取的最大字节数,则需要提供足够大的缓冲区以接收最大可能的读取量。
因此,最佳缓冲区大小取决于应用程序。只有应用程序开发人员才能知道数据的特征。例如,水进入浴池的速度有多快。您能负担得起什么尺寸的浴池(嵌入式应用程序),从浴池中提起水桶越过花园又能多快返回。
这取决于可用内存、文件大小和其他内容。你最好做一些测量。
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)
| 归档时间: |
|
| 查看次数: |
5793 次 |
| 最近记录: |