正在为以下内容编写javadoc:
/**
* ...Buffers the input stream so do not pass in a BufferedInputStream ...
*/
public static void meth(InputStream is) throws IOException {
BufferedInputStream bis = new BufferedInputStream(is,
INPUT_STREAM_BUFFER_SIZE);
// rest omitted
}
但是,将缓冲的输入流传入真的是一个问题吗?因此:
InputStream is = new BufferedInputStream(new FileInputStream("C:/file"), SIZE);
meth(is);
是否将is缓冲到bis中,或者java是否检测到is已缓冲并设置bis=is?如果是,不同的缓冲区大小是否会有所不同?如果没有,为什么不呢<注意:我说的是输入流,但实际上这个问题也适用于输出流
答案是否定的,Java不会检测到双缓冲。
由用户来避免这个问题。BufferedInputStream
无法知道您传递给构造函数的InputStream
是否被缓冲。
以下是BufferedInputStream构造函数的源代码:
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
编辑
从评论来看,双缓冲区流有问题吗?
简而言之,答案是肯定的。
缓冲的思想是提高速度,以便将数据假脱机到内存中,并以块的形式写入(通常是非常慢的IO)。如果您使用双缓冲区,则会将数据假脱机到内存中,然后将该数据刷新回其他位置的内存中。这当然要付出速度方面的代价。。。
如果您缓冲流两次,那么它将使用更多内存并且比您只缓冲一次慢,但它仍然可以工作。
当然,记录您的流是否进行缓冲是值得的,这样用户就知道他们自己不需要这样做。
一般来说,最好是阻止而不是积极防止这种滥用。
但是传递缓冲的输入流真的是个问题吗?
不是真的。这样做可能会产生很小的开销,但与读取输入的总体成本相比,它可以忽略不计。
如果查看BufferedInputStream的代码(例如,read1方法),您将看到在堆叠缓冲流时,块读取的实现效率很高。
[关于示例代码:]java会检测到is已经被缓冲并设置bis=is
吗?
不。
如果没有,为什么不呢?
因为Java(语言,编译器)通常不理解Java库类的语义。在这种情况下,由于这种优化的好处可以忽略不计,因此不值得实施。
当然,您可以自由地编写meth方法来显式地执行这类操作。。。虽然我预测这不会有什么不同。
我不太明白为什么在read1中,只有当请求的长度小于buf.length(或者输入流中有一个标记的位置)时,他们才“费心”复制到输入缓冲区
我假设您引用的是此代码(在read1中):
if (len >= getBufIfOpen().length && markpos < 0) {
return getInIfOpen().read(b, off, len);
}
第一部分是说,如果用户要求的缓冲区大小小于流配置的缓冲区大小,我们不想使缓冲区短路。(否则,我们会遇到一个问题,即使用较小的请求长度执行读取(byte[],int,int)
第二部分是关于标记/重置的实现方式。BufferedInputStream使用缓冲区来实现它,而不是在底层流上使用标记/重置(这可能受支持,也可能不受支持)。你所看到的是这种逻辑的一部分。(您可以自己处理细节……阅读源代码中的注释。)
今天早些时候很无聊,我开始思考Java中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了一个相当大的文本文件,并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四项测试: 使用无缓冲的输入和输出字节流复制文件 毫不奇怪,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我来说)是案例2和案例3之间的速度差异。部分样本结果如下: 对于那些感兴趣的人,可以
问题内容: 我碰到一行,命令的输出已完全缓冲。这是什么意思? 问题答案: 在线C11标准 7.21.3 / 3: 当流没有 缓冲时 ,字符应尽快从源或目标出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被 完全缓冲时 ,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被 行缓冲时 ,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在无缓冲流上请求
问题内容: 是缓冲还是无缓冲? 我读到这是的对象,并且是所引用的对象的类型。 而且它们都是Unbuffered的,所以为什么要刷新unbuffered …是否可以刷新unbuffered,我已经读过它们被立即写入。 问题答案: 是“标准”输出。在大多数操作系统上,终端io被缓冲,并且支持分页。 在Javadoc中, “标准”输出流。该流已经打开并且准备接受输出数据。通常,此流对应于主机环境或用户指
问题内容: 什么是输出缓冲?为什么在PHP中使用它? 问题答案: Web开发人员的输出缓冲,初学者指南 如果没有输出缓冲(默认),则HTML将通过脚本逐步地作为PHP进程发送到浏览器。使用输出缓冲,您的HTML存储在一个变量中,并在脚本末尾作为一个片段发送到浏览器。 Web开发人员的输出缓冲优势 单独打开输出缓冲可减少下载和呈现HTML所需的时间,因为在PHP处理HTML时,不会将其分段发送给浏览
我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无
问题内容: 我正在研究一个项目,并且在使用Java的双重缓冲方面已经读了尽可能多的内容。我想做的是向我的JFrame添加一个组件或面板或包含要绘制到其上的双缓冲表面的东西。如果可能,我想使用硬件加速,否则请使用常规软件渲染器。到目前为止,我的代码如下所示: 我创建了一个抽象的游戏类和一个调用Update和Draw的游戏循环。现在,如果您看到我的评论,那就是我主要关注的领域。有没有一种方法可以获取图