资讯专栏INFORMATION COLUMN

那些你一直没有搞明白的Java缓冲流细节!

FrancisSoung / 1617人阅读

摘要:缓冲区中的数据保存直到缓冲区满后才写出,也可以使用方法将缓冲区中的数据强制写出或使用方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。实验一共个当设置数组长度为时没有输出,设置时有输出。

>>FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果。而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的。
  应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,每次等到缓冲区满了时,就将数据一次性整体写入设备,避免了每一个数据都和IO进行一次交互,IO交互消耗太大。

使用flush()和不使用flush()效果对比 不使用flush()
       String s = "Hello World";
        try {
            // create a new stream at specified file
            PrintWriter pw = new PrintWriter(System.out);
            // write the string in the file
            pw.write(s);
//            // flush the writer
//            pw.flush();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

输出:

buffer没有满,输出为空。

使用buffer()
        String s = "Hello World";
        try {
            // create a new stream at specified file
            PrintWriter pw = new PrintWriter(System.out);
            // write the string in the file
            pw.write(s);
            // flush the writer
           pw.flush();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

得到期望的输出结果。

解析 close()和flush()作用有交集!
public static void main(String[] args) {
        BufferedWriter fw =null;
        try {
            fw =  new BufferedWriter(new FileWriter("e:	est.txt"));
            fw.write("wo shi lucky girl.");
            //fw.flush();
            fw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 //fw.flush();这句有和无并不影响输出结果,不太明白词句是否必要?

因为close的时候,会把你没flush掉的一起flush掉。
缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。在这个例子中,flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出

Java默认缓冲区大小是多少?

默认缓冲去大小8192字节。

实验
  char[] array  = new char[8192];
        Arrays.fill(array,"s");
        PrintWriter pw = new PrintWriter(System.out);
        pw.write(array);
  output:
    
  char[] array  = new char[8193];
        Arrays.fill(array,"s");
        PrintWriter pw = new PrintWriter(System.out);
        pw.write(array);
  output:
    ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss..一共8193个s...sssssssssssssssssssssssssssssssssssssssssssssss

当设置数组长度为8192时没有输出,设置8193时有输出。

经典问题 数据重复问题

《重点看答案解析!!!》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86026.html

相关文章

  • 那些一直没有明白Java缓冲细节

    摘要:缓冲区中的数据保存直到缓冲区满后才写出,也可以使用方法将缓冲区中的数据强制写出或使用方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。实验一共个当设置数组长度为时没有输出,设置时有输出。 >>FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果。而B...

    lansheng228 评论0 收藏0
  • 2018年第一周-JavaIO系统

    摘要:过滤器流,如等,是类库,是为了提供一些类让你能够处理一些极为常见的数据格式。读写器,由于流和过滤器流还是仅次于处理字节,也就是二进制。过滤器流缓冲流和类将写入的数据存储到缓冲区中一个名为的保护字节数组字段,直到缓冲区满或刷新输出流。 A little older, a little wiser, but happy to see you. ——Interstellar 2018年了,再...

    kgbook 评论0 收藏0
  • 高薪程序员&面试题精讲系列22之说说JavaIO,常用哪些IO

    摘要:一面试题及剖析今日面试题今天壹哥带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是流。在这里壹哥会从两部分展开介绍流,即与流。除此之外尽量使用字节流。关闭此输入流并释放与流相关联的任何系统资源。 一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可...

    fnngj 评论0 收藏0
  • 好记性不如烂笔头——NIO学习笔记

    摘要:该线程在此期间不能再干任何事情了。线程通讯线程之间通过等方式通讯。选择器传统的模式会基于服务器会为每个客户端请求建立一个线程由该线程单独负贵处理一个客户请求。 本文是对NIO知识的归纳与整理 1.阻塞与同步 1)阻塞(Block)和非租塞(NonBlock): 阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞:往往需要等待缞冲区中的数据准备好...

    王伟廷 评论0 收藏0
  • 阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0

发表评论

0条评论

FrancisSoung

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<