关于字节流输出流,字符输出流,缓冲字节输出流,缓冲字符输出流,转换输出流,序列化输出流这些输出流是否在不close的情况下必须要flush()刷新才能写入

起因是在网络编程进行服务端和客户端通信的时候,因为要给客户端回写数据,然后发现程序一直运行不结束,仿佛卡住了一样,后来知道是自己的逻辑写错了

但是我在排查的时候想到,如果程序一直运行着,不关掉,那么返回给客户端的数据是否会回写,于是有了题目这个想法,因为当时学习的时候并没有对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()了,但是保不齐以后增加代码会对数据进行操作,这个时候就容易出问题了




原文地址:https://www.cnblogs.com/skyvalley/p/13977315.html