A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张善颖 中级黑马   /  2013-3-17 12:34  /  4599 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写了一个小程序,就是在一个文件中打印100个随机数,但是有点小问题,程序如下:
package com.sxtscience.msb.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestBufferedReader {
        public static void main(String[] args) {
                try {
                        FileWriter fw = new FileWriter("D:\\My programs\\JAVA\\first application\\src\\com\\sxtscience\\msb\\io\\TestBuffer.bat");
                        BufferedWriter bw = new BufferedWriter(fw);
                        BufferedReader br = new BufferedReader(new FileReader("D:\\My programs\\JAVA\\first application\\src\\com\\sxtscience\\msb\\io\\TestBuffer.bat"));
                        String line;
                        for(int i = 0; i < 100; i++) {
                        /*
                         * 在执行bw.write的时候并没有真正的把数据写入文件中,而是写入缓冲区
                         * 在文件关闭的时候才真正的写入了文件中
                         * */       
                                bw.write(Double.toString(Math.random()));
                                bw.newLine();
                        }
//                        bw.flush();          //如果不加这一句的话会出现错误
                        while((line = br.readLine()) != null) {
                                System.out.println(line);
                        }
                        bw.close();
                        br.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

flush是用来把缓冲区中的东西都写入文件中的吧,那为什么在FileOutputStream中不使用flush也没事呢?

还有我发现一个问题就是在使用FileOutputStream或是BufferedWriter的write()方法的时候,不会立刻把数据写入文件中,而是在文件关闭的时候才会写入,这又是什么原理呢,是不是内部运行时使用的是缓冲的机制?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
flush是把缓存区的写入的数据刷到指定的文件中 FileOutputStream是用来读取文件中的字符流的 文件本身就存在 不使用也不会出错 而FileInputStrean 时时刻刻在写入数据 但这样对于资源的消耗特别大 如果写入的数据量很大时 用缓存可以提高效率 所以为了提高效率我们我们才用缓存机制 所以如果不使用缓存技术那么不需要flush 如果使用必须得使用flush 不然无法在指定的文件中写入数据

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
1、通过反射击发现字节流没有缓冲区,但都实现了Flushable接口,字符流底封装了字节流,
2、我想字节流有flush方法的原因是:当字符写入流调用flush方法是,该方法会调用其内封的字节流的flush方法,
   目的告诉底层字节流,把字符流XXX缓冲的内容写到文件中。
3、我想字符流算是字节流的一个包装类吧

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 董霁辉 于 2013-3-17 23:46 编辑

1、 flush方法,刷新流对象的缓冲中的数据,将数据写入目的地。2、flush刷新后,流可以继续使用 3、write方法,将字符串写入到流中。4、close方法,关闭流资源,但是关闭之前会刷新一次内部的缓冲区中的数据.

希望能对你有帮助

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
其实关键还是搞清楚字符流和字节流的关系就懂了,在IO流中,字节流是万能的,字符流是在字节流的基础上增加了编码来的,字符流需要刷新的原因是一方面是要调用字节流的,另外还需要查询编码,而字节流本身是否是实时发送,这也是可以设置的,其实这些都是规则,都是为了提高效率,有时候就和物理定理一样,没有为什么。
回复 使用道具 举报
若还有问题,请继续追问,没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马