http://blog.csdn.net/veryitman/article/details/6460726
Java设计Io流可谓是煞费苦心,如果你是初学者我敢保证第一次接触Java的IO类,一定会“狂晕!!”,晕,倒不是因为它有多么难学,而是太多,而且及其让人容易迷惑。在编程日子中,尤其是在网络编程中,几乎离不开Java的IO,关于Java的IO流的分类,可以到网上soso,今天跟大家分享一下flush方法。
1. OutputStream类的flush方法
该类实现了Flushable接口,所以重写了flush方法,看看flush()源码,会更加的让你明白:
- public void flush() throws IOException {
- }
sorry,该实现为空。就是一个空方法,什么也不做。看清楚啊,该方法不是抽象方法,是一个实实在在的方法。除了方法体中一无所有,其它还好!!!汗!!!看JDK的api如何解释!
- flush
- public void flush()
- throws IOException
- 刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
- 如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
- OutputStream 的 flush 方法不执行任何操作。
- 指定者:
- 接口 Flushable 中的 flush
- 抛出:
- IOException - 如果发生 I/O 错误。
开始,我安慰自己,该类是一个抽象类,它的子类肯定重写了该方法。好吧,OutputStream的直接子类有:
- ByteArrayOutputStream
- FileOutputStream
- FilterOutputStream
- ObjectOutputStream
- OutputStream
- PipedOutputStream
注意:这里的子类OutputStream是包 org.omg.CORBA.portable 的。
对于FileOutputStream、ByteArrayOutputStream、org.omg.CORBA.portable.OutputStream类它们的flush()方法均是从父类继承的flush方法。
FilterOutputStream类重写了flush()方法,但是实质还是调用父类的flush方法。
ObjectOutputStream、PipedOutputStream类重写了flush()方法。
好吧,来两个个小例子,很简单,第一个例子主要是向文本中写入字符串,第二个例子向文本中写入一定字节的数据,如下代码:
- package mark.zhang;
- import java.io.BufferedOutputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- public class Test {
- public static void main(String[] args) throws Exception {
- File file = new File("text.txt");
- if(!file.exists()) {
- file.createNewFile();
- }
- FileOutputStream fos = new FileOutputStream(file);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- DataOutputStream dos = new DataOutputStream(fos);
- dos.writeBytes("java io");
- }
- }
- package mark.zhang;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- public class Test {
- public static void main(String[] args) throws Exception {
- File file = new File("text.txt");
- if(!file.exists()) {
- file.createNewFile();
- }
- FileOutputStream fos = new FileOutputStream(file);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- byte[] b = new byte[1024*8];
- bos.write(b);
- bos.flush();
- }
- }
这两段代执行后,分别会在当前目录下产生7字节的文件(内容为java io)和1KB字节的文件。说到这里,有些人会说,这有什么稀奇,至于吗???呵呵,别急,淡定!!现在修改第二个代码,主要是注释掉调用flush()方法,如下:
- package mark.zhang;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- public class Test {
- public static void main(String[] args) throws Exception {
- File file = new File("text.txt");
- if(!file.exists()) {
- file.createNewFile();
- }
- FileOutputStream fos = new FileOutputStream(file);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- byte[] b = new byte[1024];
- bos.write(b);
- //bos.flush();
- }
- }
ok,再次运行代码,额的神啊???文件大小居然是o字节。why????flush()方法有那么神奇,汗??!!!
仔细的你会发现,第一个代码并没有调用flush()方法,居然可以。为什么第二个就不可以呢?还是看源码,有说服力。
DataOutputStream继承FilterOutputStream,实现了DataOutput接口。我们知道FilterOutputStream类重写了flush()方法,但是实质还是调用父类的flush方法。DataOutputStream类的flush()方法效仿其父类FilterOutputStream的做法,如下:
- public void flush() throws IOException {
- out.flush();
- }
那么,即使你在代码后面加上dos.flush();与不加是一样的效果,因为它们的父类flush()方法均为空,这就是为什么第一个代码的神奇所在。再看看第二个代码的病因在哪里?先看看BufferedOutputStream类的结构:
- public class BufferedOutputStream extends FilterOutputStream
再看看,它的flush()方法:
- public synchronized