黑马程序员技术交流社区

标题: 问一个有关IO的问题 [打印本页]

作者: 李然    时间: 2013-12-26 10:42
标题: 问一个有关IO的问题
请问各位高手,filereader类中的read方法,bufferreader类中的readline方法,都说后者比前者效率高,但是readline虽然会先把数据读出来放在缓冲区的数组中,但不也是一个一个读的吗?效率到底差在哪啊?难道就差在readline遇到换行符不往数组里放?仔细想想,readline先把数据放在缓冲区中,在写入流中,再刷新流放入目的地,好像比read方法多一个步奏啊,效率比read方法慢才对啊,请各位高手指导一下。。。。

作者: FFF    时间: 2013-12-26 13:35
本帖最后由 FFF 于 2013-12-26 13:37 编辑

比如搬砖。
你是一次搬一个砖上十楼去快,还是一次搬一车砖上十楼去快?
搬一车砖的时候,同样是多了一个把砖放到车里的动力。、但你觉得是一次搬一车,还是一次搬一个砖快呢?
你搬砖的时候,同样是要把砖拿起。把砖放下。

缓冲流没有学好啊、同学还要多多努力,
作者: 魚淰⑦秒_涐淰⑦    时间: 2013-12-26 13:49
楼上 也说 了 bufferReader 起到了一个缓冲的作用
作者: lichao    时间: 2013-12-26 16:35
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;

  6. class  BufferedReaderDemo
  7. {
  8.         public static void main(String[] args) throws IOException
  9.         {
  10.                 FileReader fr = new FileReader("BufferedReaderDemo.java");
  11.                 FileReader fr1 = new FileReader("BufferedReaderDemo.java");
  12.                 BufferedReader bufr = new BufferedReader(fr);
  13.                 FileWriter fw = new FileWriter("buf.txt");
  14.                 FileWriter fw1 = new FileWriter("buf1.txt");
  15.                 BufferedWriter bufw = new BufferedWriter(fw);
  16.                 int i=-1;
  17.                 String line = null;
  18.                 long stact = System.currentTimeMillis();
  19.                 while((i=fr1.read())!=-1)//用read:它读一个写一个,读取流和写入流来回的进出内存比较耗时
  20.                 {
  21.                         fw1.write(i);
  22.                         fw1.flush();
  23.                 }
  24.                 System.out.println(System.currentTimeMillis() - stact);
  25.                 stact = System.currentTimeMillis();
  26.                 while((line=bufr.readLine())!=null)//用readLine:读一堆写一堆,读取流读够了,写入流在写,读取流和写入流交换不频繁。
  27.                 {
  28.                         bufw.write(line);
  29.                         bufw.newLine();
  30.                         bufw.flush();
  31.                 }
  32.                 System.out.println(System.currentTimeMillis() - stact);
  33.         fw1.close();
  34.                 bufr.close();
  35.                 bufw.close();
复制代码


作者: 李然    时间: 2013-12-27 04:44
FFF 发表于 2013-12-26 13:35
比如搬砖。
你是一次搬一个砖上十楼去快,还是一次搬一车砖上十楼去快?
搬一车砖的时候,同样是多了一个把 ...

恩,多谢。
作者: 高正新    时间: 2013-12-29 17:06
读取的速度应该没差多少,使用bufferreader,主要是因为它的缓冲区,优化了数据保存到硬盘的时间。
read方法是读一个,存一个,具体是读一个字符到内存,然后将这个字符存到硬盘。因为硬盘在不停的转,存一次,硬盘就需要定位一次(就是寻道)。
bufferreader是读一定数量,然后将这些数据一次存到硬盘,这样硬盘只需要寻道一次。这样一来,时间就被节省下来了。
作者: 杨丽静    时间: 2013-12-30 23:05
readLine()方法,表示每次读取数据先存入缓冲区读完一行后再写入流中,而read()方法读一个数据写一个数据所以效率较低




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2