java outputstream flush_对OutputStream类的flush()方法的误解

在学习了《文件传输基础——Java IO流》 课程后,发现自己对flush()方法的调用有很多疑惑。在查询资料和自己看源码以及动手试验之后发现有以下几个特点。如有误也请大家指正出来,一切为了java,谢谢~

FileInputStream的 flush()是继承于其父类OutputStream的,但是OutputStream类的flush()什么都没做。

当OutputStream是BufferedOutputStream时,BufferedOutputStream中重写了flush()方法,并在其中调用了flushBuffer()方法以及OutputStream的flush()方法

public synchronized void flush() throws IOException {

flushBuffer();

out.flush(); //OutputStream

}

private void flushBuffer() throws IOException {

if (count > 0) {

out.write(buf, 0, count); //OutputStream,buf是缓冲区

count = 0;

}

}

3.而在BufferedOutputStream中 缓冲区buffer其实就是一个byte[],BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。

public synchronized void write(byte b[], int off, int len) throws IOException {

if (len >= buf.length) {

/* If the request length exceeds the size of the output buffer,

flush the output buffer and then write the data directly.

In this way buffered streams will cascade harmlessly. */

flushBuffer();

out.write(b, off, len);

return;

}

if (len > buf.length - count) {

flushBuffer();

}

System.arraycopy(b, off, buf, count, len); //写入缓冲区

count += len;

}

4.那么什么时候才需要调用flush()呢?

举个例子:

public static void main(String[] args) throws IOException {

File demo = new File("demo");

if(!demo.exists()){

demo.mkdir();

}

File file = new File(demo, "raf.dat");

if(!file.exists()){

file.createNewFile();

}

PrintWriter pw = new PrintWriter(file);

String s = "";

for(int i = 0;i<2000;i++){

s="我是要写入到记事本文件的内容"+i;

pw.write(s);

}

pw.close();

}

在这段代码中,加了pw.close() ,可以完整的输出到“我是要写入到记事本文件的内容1999”。而不加pw.close(),在输出“我是要写入到记事本文件的内容1804”时,输出不完整了,1804接下来的字符串也被丢弃了(这是因为1804到1999这部分没有填满缓冲区)。如果将pw.close()替换成pw.flush()也可以进行完整的输出(这只是测试,正式使用时别忘了加将pw.close())。

也就是close()时会自动flush,在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush();

(这种情况适用于字节流:BufferedOutputStream,字符流的大部分Writer类(是不是全部我没有去验证),本质上只要在某类及其父类中有定义缓冲区的都适用。)

而FileOutputStream及其父类没有缓冲区,即在使用时不需要调用flush()。

感谢 作者cmoaciopm 的博客分享(感谢是感谢,但是我不是直接copy的呀。。。我要申请原创。。。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值