java写文件时,输出不完整的原因以及解决方法close()或flush()

41 篇文章 10 订阅
28 篇文章 0 订阅

在java的IO体系中,写文件通常会用到下面语句

BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt"));

用到这个的时候一定不能忘了他的伴侣代码。。

bw.close();

或者

bw.flush();


实际上,FileWriter在写文件时,会把内容存储到一块缓冲区中,当缓冲区满后,才会把缓冲区中的内容写入文件,内容再继续存到缓冲区,如此反复,而flush()方法里面实际是调用了flushBuffer(),会将内存中的内容强制写到文件中,即使内存没满。这就是为什么最后要调用一次fileWriter.close(),close()方法里面同样调用了flushBuffer(),这样就可以了。否则就会最后有少部分的内容缺失。特别是写小文件的时候,会出现文件空白,没有内容。
这个问题很常见,值得注意。下面是jdk7中flushBuffer()的源码。

/** Checks to make sure that the stream has not been closed */
private void ensureOpen() throws IOException {
    if (out == null)
        throw new IOException("Stream closed");
}

/**
 * Flushes the output buffer to the underlying character stream, without
 * flushing the stream itself.  This method is non-private only so that it
 * may be invoked by PrintStream.
 */
void flushBuffer() throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar == 0)
            return;
        out.write(cb, 0, nextChar);
        nextChar = 0;
    }
}







  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值