关于Io流的close的问题 本帖最后由 u010010338 于 2013-09-02 01:09:54 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 输出流有缓冲区,原则是数据先输入到缓冲区,缓冲区满了才输出。关闭前需要清空flush一下缓冲区(这是习惯),不然缓冲区里最后剩下的数据就没了。你这里可以在osw.close();加一句osw.flush();就不会只有def的情况了。至于你说的close()是因为close()方法会调用flush(),所以才会出现你说的情况。不过具体缓冲区是啥,close()怎么调用的flush()俺也不清楚。查了下api,发现原来是Outputstreamwriter 里的StreamEncoder自带一个ByteBuffer字节缓冲区。close()方法会先清空这个缓冲区再关闭流。现在清楚了吧好人做到底这是StreamEncoder的源码http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.htmlPS:输入输出流每次用完一定得关掉,不然它占资源,还不报错。到时会死的很惨一般把close放在finally里。 osw调用write()方法是将字符串保存到缓冲区中,当你关闭资源时调用close()方法之前,会自动调用一次flush()方法,此方法会将缓冲区中的字符串一次性发送到文件中,然而你又创建了一个新的OutputStreamWriter对象,还是往同一个文件中写字符串,因为第二个参数是true,表示追加操作,所以当你第二次调用close()方法时,又会将缓冲区的字符串"def"一次性写入文件中,此次写入是追加不是覆盖,所以最终你的结果是abcdef,如果没有第一个close()方法,则第一次要写入的字符串"abc"会一直保存在缓冲区中,因为你没有调用flush()方法,你又将引用指向新创建的第二个OutputStreamWrtier对象,再往同一个文件中写入字符串,最后调用close()方法,会调用flush()将"def"写入文件,而abc则一直保存在缓冲区中,没有写入成功! 写人流的话一定要用flush();清空缓存写入文件!最后再close 请问这段代码有什么问题?为什么不能显示查找的位置。 求助,代码出问题! 实现一算法:两个字符串 连续字符相同 OpenSwing 怎么用? 在线等。。。组件刷新问题,请帮帮我吧 myeclipse 图形插件在哪下啊 类型转换问题 哪里有JSP-API 的CHM格式的帮助啊? 往上面多走一格 用javamail1.3如何发送html的邮件 日期格式转换问题 关于正则表达式匹配的问题,想问问大家
你这里可以在osw.close();加一句osw.flush();就不会只有def的情况了。
至于你说的close()是因为close()方法会调用flush(),所以才会出现你说的情况。
不过具体缓冲区是啥,close()怎么调用的flush()俺也不清楚。
查了下api,发现原来是Outputstreamwriter 里的StreamEncoder自带一个ByteBuffer字节缓冲区。close()方法会先清空这个缓冲区再关闭流。现在清楚了吧
好人做到底这是StreamEncoder的源码
http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html
PS:输入输出流每次用完一定得关掉,不然它占资源,还不报错。到时会死的很惨一般把close放在finally里。