java.io 包中的outputStream 中有一个方法。
public void flush() throws IOException {
}
记得在刚开始学java 的时候在用完outputStream之后要先flush 然后close
这是为什么呢。
本以为,如果执行这个jvm会帮我们调用系统刷新系统的输出缓冲区。于是我就测试了一下。
@Test
public void tests() throws IOException {
InputStream inputStream=new FileInputStream("E:/test/te.txt");
FileOutputStream outputStream=new FileOutputStream("E:/test/te2.txt");
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);
int len;
//8192 是buffoutpuStream 默认的值
byte[] b=new byte[8192];
while ((len=inputStream.read(b))!=-1){
bufferedOutputStream.write(b,0,len);
//bufferedOutputStream.flush();
outputStream.flush();
}
}
我在 outputStream.flush();这里打了断点,执行到这,首先还没有执行这个语句,文件创建出来了但是没有东西,不难理解这个是写到了buffoutputStream 中的buff 中了。当我执行下一步以后,也就是执行了flush() ,再去看还是没有。说明我想多了,就是什么都没执行。
public synchronized void flush() throws IOException {
flushBuffer();
out.flush();
}
这里有一个小插曲,我在执行bufferedOutputStream.flush();的时候是可以的。我看了一下源码是,调用了flushBuffer() 所以真正起作用的是flushBuffer()。
private void flushBuffer() throws IOException {
//这里count 是buff 中现在有效的数据个数
if (count > 0) {
out.write(buf, 0, count);
count = 0;
}
}
这里是调用了fileoutpuStream 的write() ;而这里write是调用的本地方法来实现对磁盘的写入的。
private native void write(int b, boolean append) throws IOException;
所以真正起作用的还是一个个字节写入磁盘的write.
总结:如果没有特殊的处理重写 flush()是没有作用的
例如 只是继承了OutputStream的 fileOutputStream.
所以如果这两个类的对象调用flush()毫无意义。