JavaIO流
-
来看一下
FileOutputStream
:-
FileOutputStream.flush()
进入后发现是直接调用其父类也就是OutputStream里面的flush()方法。也就是FileOutputStream并没有对这个方法重写。嗯~ 没啥问题。
-
FileOutputStream.close()
进去查看close的具体实现,发现FileOutputStream重写了基类的close()方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void close() throws IOException {
synchronized (closeLock) { //上个锁
if (closed) {
return;
}
closed = true;
}
// Android-added: CloseGuard support.
guard.close(); // 记录防止资源泄漏
if (channel != null) { // 如果有channel一起关闭
channel.close();
}
// BEGIN Android-changed: Close handling / notification of blocked threads.
if (isFdOwner) {
IoBridge.closeAndSignalBlockedThreads(fd);
}
// END Android-changed: Close handling / notification of blocked threads.
}可以看到在关闭文件流前做了一些资源泄露的检查等工作,但并没有调用
flush()
来刷新流,所以如果此时流中还有数据,并且没有手动刷新,直接关闭数据可能会丢失。
-
-
再来看一下
BufferedOutputStream
:BufferedOutputStream继承关系:
- BufferedOutputStream.flush():
1 | public synchronized void flush() throws IOException { |
1 | /** 刷新内部缓冲区 */ |
BufferedOutputStream提供了缓冲区的功能,所以在flush方法里增加了缓冲区刷新的功能
- BufferedOutputStream.close():
可以发现BufferedOutputStream() 的父类FilterOutputStream()对基类的方法进行了重写,在close()
前还调用了一次flush()
方法
1 |
|
这里的flush()
方法并不是基类的flush,FilterOutputStream()也对这个函数进行了重写:
1 |
|
上面的out
变量即为基类的一个对象,用来调用基类的方法。
1 | protected OutputStream out; |
综合起来看发现,FilterOutputStream()方法是对close方法进行重写,在关闭流之前自动调用了一次刷新,这样即使缓冲区还有数据,我们直接调用BufferedOutputStream的close方法也不会造成数据的丢失。
BufferedOutputStream全部源码分析
1 | public |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Rick!
评论