A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wodeairenw 中级黑马   /  2013-3-15 21:49  /  4626 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wodeairenw 于 2013-3-17 00:17 编辑
  1. import java.io.*;
  2. class  FileStream
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 writeFile();
  7.         }
  8.         public static void writeFile()throws IOException
  9.         {
  10.                 FileOutputStream fos =new FileOutputStream("fos.txt");
  11.                 fos.write("aadad".getBytes());
  12.         }
  13. }
复制代码
字节写入流(输出流)写入文件内的数据可以不用刷新,他是直接操作字节的,操作一个写一个,但在OutputStream类里面为什么还定义一个flush()刷新方法。这是什么时候用的,或者他的子类能否用到,如BufferedOutputStream。但是毕老师讲解BufferedOutputStream(字符缓冲区时)复制Mp3的时候没有刷新动作。为什么。

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-16 23:27

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 吴上波 于 2013-3-15 22:19 编辑

楼主你好:
OutputStream 类因为实现了Flushable接口,所以其必须进行对flush()方法的覆写,但是因为OutputStream没用到缓冲区,所以OutputStream 的 flush 方法的代码块是空的,不执行任何操作,在使用OutputStream类时没有用到这个方法的场景。
具体的楼主可以参考一下JDK API手册

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴上波 于 2013-3-15 23:53 编辑

BufferedOutputStream 是用于缓冲字节输出流的, 需要使用flush()将流输出到底层。同样的还有BufferedWriter用于缓冲字符输出流,也需要flush()进行刷新
回复 使用道具 举报
张熙韬 发表于 2013-3-15 23:55
只要用到缓冲区,就需要刷新!
如果要操作文字数据,优先考虑字符流。
为了提高效率加入了缓冲区,缓冲区的 ...

谢谢讲解。请看问题最后一排。能解答下吗?
回复 使用道具 举报
输出流写入数据时,底层是一次写一个字节的数据。这时,数据是直接写入硬盘的。但是进行缓冲处理后,每次拿到的字节就会存在缓冲区,并没有写入硬盘。因此,需要使用flush()方法将内存中数据强制写入硬盘。
所以,当输出流使用到缓冲,就要进行刷新。
1.writer的子类都要使用flush()方法。因为该类是对字符操作的,而字符不能直接写入。所以该类定有一个内部的缓冲,用于存放非字节类型数据。
2.outputstream的子类Bufferedoutputstream也要使用flush()方法。
3.flush()方法只是针对输出流而言的,输入流没有flush()方法。
最后一个问题:在writer和outputstream类中,close()方法会自动调用flush()方法,然后才会关闭资源。API文档里说的很清楚。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马