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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈波 中级黑马   /  2012-5-6 19:57  /  5917 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args) {
                FileReader  fr = null;
                FileWriter fw = null;
        try{
                fr =new FileReader("a.txt");
                fw = new FileWriter("c.txt");
                char[] buf = new char[1024];
                int ch = 0;
                while ((ch=fr.read(buf))!=-1) {
                        fw.write(new String(buf,0,ch));//这个地方为什么是new String(buf,0,ch)这个地方怎么理解呢?
                        fw.flush();
                }
        }
        catch(IOException e)
        {
               
                throw new RuntimeException("复制失败");
        }
        finally
        {
                if(fr!=null)
                try {
                        fr.close();
                } catch (IOException e) {
                        
                        throw new RuntimeException("读取关闭失败");
                }
                if(fw!=null)
                try {
                        fw.close();
                } catch (IOException e) {
                        
                        throw new RuntimeException("写入关闭失败");
                }
        }
        }
        }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 加油哦··

查看全部评分

5 个回复

倒序浏览
这是String 的一个重载的构造方法,String 是由字符组成的,对吧, 那么这就好理解了 fw.write(new String(buf,0,ch))
new String(buf,0,ch)   表示 将字符数组buf 从第一个字符(java以0开始,也可以说是第0个字符)开始,长度为ch的的所有字符构建成一个字符串,也就是String了
  而FileWriter类有write方法其中便有一个以String为参数的重载方法。
所以呢,先利用字符数组 buf 构建出一个String,然后再调用fw的write(String str) 方法将这个字符串写入文件中!

不过说实话,哥们,这样做有些画蛇添足了,因为FileWriter 本身就有一个write(cbuf, off, len) 所以你可以直接调用这个,写字符数组,而不用先转成字符串再写了。。。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 随处可见你的身影··十期一定要看到你.

查看全部评分

回复 使用道具 举报
因为 fr.read(buf) 的作用:将读到的字符存入buf,返回已经读取的字符数ch。
fw.write(new String(buf, 0, ch))的作用是将buf中的字符写入输出流
所以,若读取的字符没有装满buf,向输出流中写的只是buf中下标从0到ch的字符!
回复 使用道具 举报
fw.write(new String(buf,0,ch));//这个地方为什么是new String(buf,0,ch)这个地方怎么理解呢?
你可以查看API  里面有这样一个方法,
String(char[] value, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
通过传递的char数组,从offset开始,添加count个字符,组成一个新的字符串。
回复 使用道具 举报
char[] buf = new char[1024];
int ch = 0;
while ((ch=fr.read(buf))!=-1) {
       fw.write(new String(buf,0,ch));
     fw.flush();
}
fw.write(new String(buf,0,ch));
buf=就是把char数组的1024个数据写到指定文件里。
然而有可能读取到的数据不足1024个,那么也会在内存开辟了1024个数据大小的空间,比如只读取到了100个,只需要开辟100个数据大小的空间即可,为了节约内存
就指定从数组的0下标开始写,ch表示读取到的数据个数,读取到几个就写几个。
new String()就是将其cha数组转换为字符串
回复 使用道具 举报
new String(buf, 0, len)
首先,对于FileReader的read()方法,一次读取一个字符。在该例中,FileReader的read()方法从源文件中读取数据,每次读取一个字符,这个字符并没有直接写入到目的文件中,而是存入到了数组buf中,len相当于一个计数器,记录的是数组中存入的有效数据的长度。在整个读取过程中,数组充当了中间站的作用,提高读写效率。
以上是读的过程,然后就是写的过程。写入数据实际上是将数组buf中的数据写入到目的文件中,调用FileWriter的write()方法,write方法有多种重载形式。写入到目的文件中的数据是字符串,而内存数组buf中的数据是字符数组,所以要将数组中的有效数据变为字符串形式,即:new String(buf, 0, len),然后再调用write()方法将字符串写入目的文件。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马