那些你一向没有搞邃晓的Java缓冲流细节!

>>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:\\test.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时有输出。

典范题目

数据反复题目

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

    原文作者:Ocean
    原文地址: https://segmentfault.com/a/1190000003804439
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞