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

© 戴振良 黑马帝   /  2012-4-15 20:41  /  3550 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-4-21 02:57 编辑
  1. package com.itheima;

  2. import java.io.*;

  3. public class NewTxt {        
  4.         
  5.         public static void main(String[] args) throws Exception {
  6.                
  7.                 File f = new File("D:\\java\\abc.txt");
  8.                 FileReader fr = new FileReader(f) ;
  9.                 FileWriter fw = new FileWriter("D:\\java\\def.txt");
  10.                 BufferedReader br = new BufferedReader(fr,1000);
  11.                 BufferedWriter bw = new BufferedWriter(fw,1000);
  12.                
  13.                 char[] buf = new char[(int)f.length()];
  14.                 int len = 0;
  15.                 len = br.read(buf);
  16.                 br.close();
  17.                
  18.                 bw.write(buf,0,len);
  19.                 bw.close();               
  20.         }        
  21. }
复制代码
本来可以直接使用FileReader和FileWriter来直接进行文本文件的读取和保存做作的,但是这里使用了BufferedReader和BufferedWriter来包装它们,我查看了一下JDK,其中BufferedReader的说明如下(红色文字):
    通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
    将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

      
问题1、请问这个BufferedReader/BufferedWriter的默认缓冲区是多大?
问题2、在上面的例子中,我指定了它们的缓冲区大小为1000,我查了JDK,那里说这个参数是int型的,那我输入1000,到底是多大呢?单位是什么?
问题3、请结合上面的例子,假如我直接用FileReader/FileWriter这两个类来读取操作是怎么样的一个原理。
       而使用BufferedReader/BufferedWriter这个两个类包装FileReader/FileWriter之后进行读取又是怎么样的原理,它是加了缓冲,是怎么个缓冲法?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

8 个回复

倒序浏览
根据上面红色的JDK说明,反过来说:
    如果使用了BufferedReader/BufferedWriter,那么Reader所作的每个请求就不会都导致底层字符或字节流进行相应的读取请求。
    如果有缓冲区,则每次调用read()或readLine()不会都导致从文件中读取字节,并将其转换为字符后返回。

是这样理解的吗?即使是这样我也还是不够理解其中是怎么个缓冲法的!
回复 使用道具 举报
问题1、请问这个BufferedReader/BufferedWriter的默认缓冲区是多大?
这个缓冲就是一个char类型的数组指定的大小,大小是8192

问题2、在上面的例子中,我指定了它们的缓冲区大小为1000,我查了JDK,那里说这个参数是int型的,那我输入1000,到底是多大呢?单位是什么?
char c = new char[1000];
一千就是这个数组的大小
这个数组就是缓冲用的


问题3、请结合上面的例子,假如我直接用FileReader/FileWriter这两个类来读取操作是怎么样的一个原理。
       而使用BufferedReader/BufferedWriter这个两个类包装FileReader/FileWriter之后进行读取又是怎么样的原理,它是加了缓冲,是怎么个缓冲法?

缓冲区是内存的一块区域,往上面写和读都非常快,比直接在硬盘两个不同空间来回写东西快太多,个人理解。

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
戴振良 + 10 我设置了回复既有金钱,不知为舍停了,现在.
岳民喜 + 1

查看全部评分

回复 使用道具 举报
这些东西都可以在java源码中搜索到,不懂的都可以去看,所有东西都一清二楚,不过我很少看,哈哈
回复 使用道具 举报
郑光 发表于 2012-4-15 21:25
问题1、请问这个BufferedReader/BufferedWriter的默认缓冲区是多大?
这个缓冲就是一个char类型的数组指定 ...

假如我上面代码中的abc.txt文件中有10个字符,
如果我用FileReader来读,“是一次读一个字符到buf数组里面”,
而用BufferedReader来读则是“一次性读取完到缓冲区,然后一次性保存到buf数组里”
请问是这样理解的吗?如果是这样,那这个buf是个什么东西,它不就是个数组嘛!也不是硬盘里的文件,它在内存里是怎么存在的,应该是一个存储区域吧,那这个区域和Buffered里的缓冲区为什么就不一样呢?
回复 使用道具 举报
张卯 发表于 2012-4-15 21:17
我理解的缓冲区就是内存中的一片区域,可以比喻为生活中的运输工具,装多一点一起运走肯定比一件件运要效率 ...

假如我上面代码中的abc.txt文件中有10个字符,
如果我用FileReader来读,“是一次读一个字符到buf数组里面”,
而用BufferedReader来读则是“一次性读取完到缓冲区,然后一次性保存到buf数组里”
请问是这样理解的吗?如果是这样,那这个buf是个什么东西,它不就是个数组嘛!也不是硬盘里的文件,它在内存里是怎么存在的,应该是一个存储区域吧,那这个区域和Buffered里的缓冲区为什么就不一样呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马