Java中的OutputStream
有一个名为flush()
的方法。根据其文件:
刷新此输出流并强制写出所有缓冲的输出字节。
我如何理解这个缓冲区的多字节容量是多少?
额外注意:我使用OutputStream
HttpURLConnection
方法获得了自己的getOutputStream()
。
答案 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
喝彩!