起因是在网络编程进行服务端和客户端通信的时候,因为要给客户端回写数据,然后发现程序一直运行不结束,仿佛卡住了一样,后来知道是自己的逻辑写错了
但是我在排查的时候想到,如果程序一直运行着,不关掉,那么返回给客户端的数据是否会回写,于是有了题目这个想法,因为当时学习的时候并没有对flush()有过深入了解
教案上也没有过多提到,一直对这个的印象都是模糊的状态,因为大部分都是直接close(),在close()之前,回写数据之后,没有其他操作,所以比较简单,话不多说,开搞:
1. 为什么没有输入流,因为所有输入流都没flush()方法。
flush()方法是定义在OutputStream和Writer这两个输出流的超类里面的方法
所以以下的流均包含了flush()方法,
FileOutputStream, 字节流输出流
FileWriter, 字符输出流
BufferedOutputStream, 缓冲字节输出流
BufferedWriter, 缓冲字符输出流
OutputStreamWriter, 转换输出流
ObjectOutputStream 序列化输出流
接着进行测试,如果不flush(),在close()前让线程睡觉,观察是否有数据输出
-------------------------------------------测试1--------------------------------
FileOutputStream, 字节流输出流
FileOutputStream fos = new FileOutputStream("xuliehua.txt"); fos.write("overwatch11".getBytes()); Thread.sleep(8000); fos.flush(); fos.close();
无需执行fos.flush(),执行完第二行write代码后直接显示在文本中
-------------------------------------------测试2--------------------------------
FileWriter, 字符输出流
FileWriter fw = new FileWriter("xuliehua.txt"); fw.write("守望先锋"); Thread.sleep(8000); fw.flush(); fw.close();
需要执行fw.flush()之后才会显示在文本中
-------------------------------------------测试3--------------------------------
BufferedOutputStream, 缓冲字节输出流
FileOutputStream fos = new FileOutputStream("xuliehua.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("overwatch".getBytes()); Thread.sleep(8000); bos.flush(); bos.close();
需要执行fw.flush()之后才会显示在文本中
-------------------------------------------测试4--------------------------------
FileWriter fw = new FileWriter("xuliehua.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write("守望先锋"); Thread.sleep(8000); bw.flush(); bw.close();
需要执行fw.flush()之后才会显示在文本中
-------------------------------------------测试5--------------------------------
FileOutputStream fos = new FileOutputStream("xuliehua.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos); osw.write("守望先锋"); Thread.sleep(8000); osw.flush(); osw.close();
需要执行fw.flush()之后才会显示在文本中
-------------------------------------------测试6--------------------------------
FileOutputStream fos = new FileOutputStream("xuliehua.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(new Overwatch("真好玩")); Thread.sleep(8000); oos.flush(); oos.close();
无需执行fos.flush(),执行完write代码后直接显示在文本中
--------------------------------------------综上所述------------------------------
只有字节流输出流FileOutputStream和序列化输出流ObjectOutputStream不需要flush()就能直接写入文件
而字符输出流FileWriter是内置了缓冲区的,缓冲字节输出流BufferedOutputStream和缓冲字符输出流BufferedWriter是内置了缓冲数组的,转换输出流OutputStreamWriter是继承了Writer的
所以总结一下:如果是和Writer相关(内置缓冲区)或者是内置了缓冲数组的流都需要flush()这个过程才能写入文件
但是为了保险起见:以后只要涉及相关输出流,不论是字节流还是字符流,只要是OutputStream和Writer相关的,都加上flush()保险,
当然如果是直接close()就不用flush()了,但是保不齐以后增加代码会对数据进行操作,这个时候就容易出问题了