黑马程序员技术交流社区

标题: 我有个关于IO流的问题 [打印本页]

作者: 神秘人F    时间: 2014-9-19 18:40
标题: 我有个关于IO流的问题
本帖最后由 神秘人F 于 2014-9-20 09:30 编辑

FileReader从文件中读取数据,其中有个方法是建立一个char[],然后用read方法将读取到的数据存放在char[]中,大家基本都是这么写的

char[] a=new char[1024];
int len=0;
while((len=fr.read(a))!=-1){
System.out.println(new String(a,0,len));
}
我就想问一下如果char[1024]都装满了,文件中的数据还没有读完,那么剩下的数据还会重新装入char[]中吗?

作者: liaorubei    时间: 2014-9-19 19:02
对的,就目前你这个代码来看,是会循环把数据装到char[] 数组里面的,
所以一般情况下,会用到临时变量,就是把读取到的数据添加到临时变量里面,
如String temp="";
while((len=fr.read(a))!=-1){
temp+=new String(a,0,len);//把数据添加到字符串里面
}

或者用StringBuilder接收
代码是这样的 :
StringBuilder builder=new StringBuilder();

while((len=fr.read(a))!=-1){
builder.append(new String(a,0,len));//把数据追加到原数据里面
}

然后使用StringBuilder的toString()方法得到所有已经接收的数据
这样使用
System.out.println(builder.toString());

当然要是只是打印出来的话,你的代码已经实现了打印出全部内容的功能了.


作者: 黑马-胡明    时间: 2014-9-19 19:17
你也可以1024的倍数,1024*n;这个问题好像毕老师是讲过,记不清了!
作者: xplcc    时间: 2014-9-19 19:47
char[1024]就相当于一个盒子,每次最多装1024(当然你可以自己设置箱子的大小最好是1024的倍数),取完后会再次重新装,直到把流中数据取完。
作者: Fightin黑马    时间: 2014-9-19 22:41
就像一辆车运东西,它会一直来回的运,直到读到结束标记-1就不运了
作者: moon1993zs    时间: 2014-9-19 23:26
对,1024.是一次所装的。也可以是1024的倍数。
作者: moon1993zs    时间: 2014-9-19 23:28
再补充一句,如果文件读完就会返回-1.
作者: sean    时间: 2014-9-19 23:32
liaorubei 发表于 2014-9-19 19:02
对的,就目前你这个代码来看,是会循环把数据装到char[] 数组里面的,
所以一般情况下,会用到临时变量,就是把 ...

我用IO流代码将C盘的图片(大小1,361,591字节)复制到D盘 图片却成了(172,471,133字节)变大了好多
而且图片也打不开,这是怎么回事?
作者: 王路强    时间: 2014-9-19 23:41
是的 装满了就会从新装载
作者: liaorubei    时间: 2014-9-20 07:46
sean 发表于 2014-9-19 23:32
我用IO流代码将C盘的图片(大小1,361,591字节)复制到D盘 图片却成了(172,471,133字节)变大了好多
而且 ...

如果是图片就不要用这个字符流了,而是应该使用字节流,
然后对应的接收类型应该是byte[]数组,而不应该是char[]数组.
文件复制和文本复制的方式有点不一样的哦




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