一直没搞懂这两个类有自动刷新和无自动刷新的区别。PrintStream out = new PrintStream(
new FileOutputStream("D:\\333\\111.txt"), true); //这里再换成false
char[] c = new char[]{'a', 'b', 'c', 'd'};
out.print(c);以上代码运行后结果是一样111.txt都已经写入abcd了。我对刷新理解是,当输出后只有刷新了,数据才会真正写入数据的目的地。
但是上面这段代码无论是否有自动刷新它都能完成写入动作,所以我觉得很疑惑,有没有自动刷新有什么区别呢?

解决方案 »

  1.   

    我试过了,还是没区别。无论是先读后写、还是先写后读,结果都一样,并没有出现FileOutputStream不close()或flash()则无法读取,或数据无法修改的情况
    // BufferedInputStream in = new BufferedInputStream(
    // new FileInputStream("D:\\333\\111.txt"));
    // int a = 0;
    // while((a = in.read()) != -1){
    // System.out.print((char)a);
    // }

    PrintStream out2 = new PrintStream(
    new FileOutputStream("D:\\333\\111.txt"), false);
    char[] c = new char[]{'e', 'f', 'g', 'h'};
    int i = 97;
    out2.print(c);

    BufferedInputStream in = new BufferedInputStream(
    new FileInputStream("D:\\333\\111.txt"));
    int a = 0;
    while((a = in.read()) != -1){
    System.out.print((char)a);
    }
      

  2.   

    看看这个吧
    http://topic.csdn.net/u/20081231/09/63d95122-79b3-467a-8523-b9d3c7e61dcb.html
      

  3.   

    你的理解是不正确的,构造函数的第二个参数为真,表示则每当写入 byte 数组、调用其中一个 println 方法或写入换行符或字节 ('\n') 时都会刷新输出缓冲区。而为假的时候会在缓冲区满的时候再写入。
    你也可以手动刷性public void flush();
      

  4.   

    一些关闭操作,也会刷新你的缓冲区,close();
    为何你没有将参数设置为true依然会写入文件,是因为jvm会关闭你的流,执行close()同时刷新你的缓冲区。
      

  5.   

    这个问题JDK5.0帮助文档里这么写到
    flush
    public void flush()
               throws IOException刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。 
    如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。 OutputStream 的 flush 方法不执行任何操作。 所以你这种情况正好是例外,不执行任何操作
      

  6.   

            PrintStream out2 = new PrintStream(
                    new BufferedOutputStream(new FileOutputStream("111.txt")), true);
            char[] c = new char[]{'e', 'f', 'g', 'h'};
            int i = 97;
            out2.print(c);
    out2.println();
            
            BufferedInputStream in = new BufferedInputStream(
                    new FileInputStream("111.txt"));
            int a = 0;
            while((a = in.read()) != -1){
                System.out.print((char)a);
            } 上面的程序中就会有区别了,设定为false则没有数据
      

  7.   

    因为在PrintStream在调用print时,还是直接调用了底层的OutputStream的print的,
    true表示在println时,会调用里面一个OutputStream的flush;false则不会调用
    在上面例子中,由于是BufferedOutputStream,不调用flush则造成了数据还没有写入文件的问题了
      

  8.   

    7楼是对的,前面我自己也想到了,只有加了BufferedOutputStream才能谈刷不刷新的问题。