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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-4-15 20:41  /  3271 人查看  /  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()不会都导致从文件中读取字节,并将其转换为字符后返回。

是这样理解的吗?即使是这样我也还是不够理解其中是怎么个缓冲法的!
回复 使用道具 举报

回帖奖励 +5

我理解的缓冲区就是内存中的一片区域,可以比喻为生活中的运输工具,装多一点一起运走肯定比一件件运要效率高~
回复 使用道具 举报
本帖最后由 张卯 于 2012-4-15 21:31 编辑

java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区
搜索找到的~
8192字符(英文字符)=8KB

点评

谢谢!!  发表于 2012-4-16 06:39
回复 使用道具 举报
问题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-16 06:39
回复 使用道具 举报
戴振良 黑马帝 2012-4-16 06:53:04
7#
郑光 发表于 2012-4-15 21:25
问题1、请问这个BufferedReader/BufferedWriter的默认缓冲区是多大?
这个缓冲就是一个char类型的数组指定 ...

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

假如我上面代码中的abc.txt文件中有10个字符,
如果我用FileReader来读,“是一次读一个字符到buf数组里面”,
而用BufferedReader来读则是“一次性读取完到缓冲区,然后一次性保存到buf数组里”
请问是这样理解的吗?如果是这样,那这个buf是个什么东西,它不就是个数组嘛!也不是硬盘里的文件,它在内存里是怎么存在的,应该是一个存储区域吧,那这个区域和Buffered里的缓冲区为什么就不一样呢?
回复 使用道具 举报
张卯 中级黑马 2012-4-16 10:51:29
9#
戴振良 发表于 2012-4-16 06:53
假如我上面代码中的abc.txt文件中有10个字符,
如果我用FileReader来读,“是一次读一个字符到buf数组里 ...

嗯,就是这样理解的。
那个buf数组,不太清楚为什么要在这里用数组,其实可以不用的,在内存中所有的数组都是在堆中开辟的。
上网搜了一下,有说BufferedReader的原理就是将数组进行了封装,又看了下源码,确实用到了数组~

数组在内存中的分布:
任何一个实体在堆内存中产生,都邑有一个起首的头地址x[0](内存开释的时辰也从头地址值开端),也就是内存分派空间的肇端位(我们可以形象的把它看作是一个房间的门商标),头地址值在内存中以16进制的情势存在。
以上方的数组声明为例:右边的new int[3]存放在堆内存中,且分派三个内存空间(x[0]、x[1]、x[2]);左边的x存放在栈内存中。x[0]就是int[3]的头地址值,假设以16进制的情势默示为"0 x0001",赋值号"="将右边的值赋给左边,其实就是把堆内存中的地址值(例如"0 x0001")赋给了栈内存中的x,x经由过程这个地址值就指向了堆内存中的实体(我们也可以形象的做个类似:就像你把你家的门商标告诉我,我就能找到你家一样)。这就叫做x引用堆内存中的数组实体(引用数据类型)。
堆内存的特点:1、内存中的实体都有内存地址值2、堆内存中的变量都有默认初始化值3、垃圾收受接管机制。
摘自:http://www.cnpetweb.com/a/xinxizhongxin/lanmu9/2011/1119/25633.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马