Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中缓冲缓冲流的结果是什么?_Java_Stream_Java Io_Bufferedinputstream - Fatal编程技术网

在java中缓冲缓冲流的结果是什么?

在java中缓冲缓冲流的结果是什么?,java,stream,java-io,bufferedinputstream,Java,Stream,Java Io,Bufferedinputstream,正在为以下内容编写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_BUFFE

正在为以下内容编写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];
}
public BufferedInputStream(输入流输入,整数大小){
超级(in),;

如果(size如果您将流缓冲两次,那么它将使用更多的内存,并且比只缓冲一次要慢,但是它仍然可以工作

当然值得记录的是,您的流进行了缓冲,这样用户就知道他们自己不需要这样做

一般来说,最好是劝阻而不是积极防止这种滥用

但传递缓冲输入流真的有问题吗

不完全是这样。这样做可能会有一点开销,但与读取输入的总体成本相比,它可以忽略不计

如果查看
BufferedInputStream
的代码(例如,方法),您将看到,当缓冲流堆叠时,块读取的实现是高效的

[关于示例代码:]java是否会检测到已被缓冲并设置为
bis=is

没有

若否,原因为何

因为Java(语言,编译器)通常不理解Java库类的语义。在这种情况下,由于这种优化的好处可以忽略不计,所以我不值得实现它

当然,你可以自由地编写
meth
方法来明确地做这类事情……尽管我预测这不会有什么不同


我不太明白为什么在read1中,只有当请求的长度小于buf.length(或者如果输入流中有标记的位置)时,他们才会“费心”复制到输入缓冲区

我假设您指的是此代码(在
read1
中):

if(len>=getBufIfOpen().length&&markpos<0){
返回getInIfOpen()。读取(b,关闭,len);
}
第一部分是说,如果用户要求的缓冲区大小小于流配置的缓冲区大小,我们不希望使缓冲区短路。(否则,我们会遇到一个问题,即以较小的请求长度执行
读取(byte[],int,int)
。)


第二部分与标记/重置的实现方式有关。
BufferedInputStream
使用缓冲区来实现标记/重置,而不是在底层流上使用标记/重置(这可能受支持,也可能不受支持)。您看到的是该逻辑的一部分。(您可以自己处理细节…阅读源代码中的注释。)

为什么不
instanceof BufferedInputStream
?你能提供到源代码的链接吗?但是
DataInputStream
呢?
ObjectInputStream
MyRandomBufferedStream
?根本无法检测流是否被缓冲。这是一种想法,但可能有一些黑客攻击-问题仍然存在ns:对流进行双重缓冲有问题吗?我应该在java文档中添加此子句吗?;)检查源代码。
BufferedInputStream
有一个“润滑路径”,用于复制整个缓冲负载的情况,这将使堆叠它们时的损坏降到最低。虽然我不太明白
read1
中的原因,但它们“麻烦”仅当请求的长度小于buf.length(或输入流中有标记位置)时才复制到输入缓冲区您的回答提供了最深入的见解,因此我接受了源代码。BufferedInputStream在复制整个缓冲负载的情况下有一个“润滑路径”,这可以最大限度地减少堆叠它们造成的损害。@EJP当然;如果没有,那将很奇怪。但是成本不是零,所以我认为这不会改变我所说的。成本是非零的-零如何?一个额外的方法调用与实际I/O相比算不了什么。
    if (len >= getBufIfOpen().length && markpos < 0) {
        return getInIfOpen().read(b, off, len);
    }