Java OutputStream缓冲区大小

时间:2017-12-01 12:10:57

标签: java buffer httpurlconnection outputstream flush

Java中的OutputStream有一个名为flush()的方法。根据其文件:

  

刷新此输出流并强制写出所有缓冲的输出字节。

我如何理解这个缓冲区的多字节容量是多少?

额外注意:我使用OutputStream HttpURLConnection方法获得了自己的getOutputStream()

1 个答案:

答案 0 :(得分:3)

这取决于您使用的 OutputStream 的种类。

让我们从基础开始,通过分析OutputStream建议作为合同的内容:

  

public void flush()              抛出IOException

     

刷新此输出流并强制执行任何缓冲的输出字节   写出来。冲洗的一般合同是称之为   指示,如果先前写入的任何字节已被缓冲   输出流的实现,这样的字节应该立即生效   写到他们预定的目的地。

     

如果此流的预期目标是提供的抽象   由底层操作系统,例如文件,然后刷新   流只保证先前写入流的字节   被传递到操作系统进行编写;它不保证   他们实际上写入了一个物理设备,如磁盘   驱动。

     

OutputStream 的flush方法不执行任何操作。

如果你看到OutputStream的flush方法,它实际上什么都不做:

public void flush() throws IOException {
}

这个想法是,正在装饰OutputStream的实现必须处理它的flush,然后将它级联到其他OutputStream,直到它到达操作系统,如果是这样的话。

所以它有所作为!通过实施它的人。具体类将覆盖flush以执行诸如将数据移动到磁盘或通过网络发送(您的情况)之类的操作。

如果你看看 BufferedOutputStream 的同花顺:

/**
 * Flushes this buffered output stream. This forces any buffered
 * output bytes to be written out to the underlying output stream.
 *
 * @exception  IOException  if an I/O error occurs.
 * @see        java.io.FilterOutputStream#out
 */
public synchronized void flush() throws IOException {
    flushBuffer();
    out.flush();
}

/** Flush the internal buffer */
private void flushBuffer() throws IOException {
    if (count > 0) {
        out.write(buf, 0, count);
        count = 0;
    }
}

您可能会看到它将自己的缓冲区的内容写入包装的OutputStream。您可以看到其缓冲区的默认大小(或者您可以更改它),请参阅其构造函数:

/**
 * The internal buffer where data is stored.
 */
protected byte buf[];

/**
 * Creates a new buffered output stream to write data to the
 * specified underlying output stream.
 *
 * @param   out   the underlying output stream.
 */
public BufferedOutputStream(OutputStream out) {
    this(out, 8192);
}

/**
 * Creates a new buffered output stream to write data to the
 * specified underlying output stream with the specified buffer
 * size.
 *
 * @param   out    the underlying output stream.
 * @param   size   the buffer size.
 * @exception IllegalArgumentException if size <= 0.
 */
public BufferedOutputStream(OutputStream out, int size) {
    super(out);
    if (size <= 0) {
        throw new IllegalArgumentException("Buffer size <= 0");
    }
    buf = new byte[size];
}

因此, BufferedInputStream 缓冲区的默认大小为8192字节。

现在您已掌握了要点,请查看 HttpURLConnection 中用于您的 OutputStream 代码,以熟悉其缓冲区(如果有的话) )。

在您的Java旅程中,您可能会得到一些将刷新操作委派给操作系统的本机代码。在这种情况下,您可能必须检查您的操作系统是否正在使用某个缓冲区以及处理IO时它的大小。我知道答案的这一部分可能听起来很广泛,但这就是现实。您需要知道自己正在使用什么才能了解​​其背后的内容。

看看这个问题: What is the purpose of flush() in Java streams?

这篇文章: http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html

喝彩!