我不确定这个问题的答案是什么:
如果我将一个BufferedInputStream包装在一个来自例如http调用的InputStream周围 - 自动执行BufferedInputStream并立即使用InputStream中的数据填充缓冲区(在“wrap”-time?),或者我是否必须调用首先在BufferedInputStream上读取(),然后缓冲区被填满?简而言之:缓冲区何时首次填充?
我在问,因为如果我有一个http电话,我希望能够快速将小文本文件的内容存储在RAM中(它们更安全),而不是依赖于连接,实际读取时仍然是开始...
如果基础TCP连接关闭,我是否会使用BufferedInputStream获得IOException,即使缓冲区设法填满了实际请求的所有数据?
答案 0 :(得分:1)
创建BufferedInputStream时,会创建一个内部缓冲区数组。当读取或跳过来自流的字节时,内部缓冲区根据需要从包含的输入流中重新填充,一次多个字节。在你read
之前,它应该是空的。
答案 1 :(得分:0)
Fill
方法仅在第一个read
或skip
方法调用中被调用。
从BufferInputStream中提取代码。
public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
Skip
对fill
操作也有类似的检查。