• 关于字节流输出流,字符输出流,缓冲字节输出流,缓冲字符输出流,转换输出流,序列化输出流这些输出流是否在不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()了,但是保不齐以后增加代码会对数据进行操作,这个时候就容易出问题了




  • 相关阅读:
    Robot Framework自动化测试(三)---Selenium API
    Robot Framework自动化测试(二)---元素定位
    Robot Framework自动化测试(一)---第一个脚本
    Jmeter压力测试简单教程(包括服务器状态监控)
    Jmeter分布式部署测试分享
    Java IO流详解
    Java集合框架
    Java异常处理
    Java 封装
    Static和递归
  • 原文地址:https://www.cnblogs.com/skyvalley/p/13977315.html
Copyright © 2020-2023  润新知