黑马程序员技术交流社区

标题: IO字节写入(OutputStream)疑问 [打印本页]

作者: wodeairenw    时间: 2013-3-15 21:49
标题: IO字节写入(OutputStream)疑问
本帖最后由 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的时候没有刷新动作。为什么。


作者: MyNameIs520    时间: 2013-3-15 22:14
本帖最后由 吴上波 于 2013-3-15 22:19 编辑

楼主你好:
OutputStream 类因为实现了Flushable接口,所以其必须进行对flush()方法的覆写,但是因为OutputStream没用到缓冲区,所以OutputStream 的 flush 方法的代码块是空的,不执行任何操作,在使用OutputStream类时没有用到这个方法的场景。
具体的楼主可以参考一下JDK API手册
作者: MyNameIs520    时间: 2013-3-15 23:50
本帖最后由 吴上波 于 2013-3-15 23:53 编辑

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2