read()和read(byte[])区别

jjfjnu 2008-04-13 09:43:21
逐个字节去复制一个文件,效率超慢,都说用read(byte[]),查看api里面的似乎read(byte[])也是循环调用read函数代码如下

public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}

int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;

int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}

不大清楚为什么read(byte[])也是逐个字节从磁盘读?????
...全文
306 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
谢谢楼上各位啦 ,呵呵。
南南北北 2008-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sky_ccy 的回复:]
这俩个还是不一样的,兄弟,,
他是在缓存里面执行的,,
你用read去读的话,一次读一个,读完写完,再读下一个
你用read(byte[])的话,是一次把n个字节存到byte[]中,再读,而这个读是在缓存中完成的。。

怎么说的 ,就像搬运转头一样,,你用人搬运呢,一次搬运一块要不停的来回的跑,
你可以用车去搬运呀,那一次可以搬运很多块,但我们别忘了,我们在装车的时候,也是要人一块的一块去装车的,,
不知道这么回…
[/Quote]
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
hmsuccess
恩 说的就是那个
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
忽然明白了
我们在装车的时候,也是要人一块的一块去装车的
这个比喻很好,很强大

hmsuccess 2008-04-13
  • 打赏
  • 举报
回复
你的意思是说for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
AwL_1124 2008-04-13
  • 打赏
  • 举报
回复
A good idea·
[Quote=引用 2 楼 sky_ccy 的回复:]
这俩个还是不一样的,兄弟,,
他是在缓存里面执行的,,
你用read去读的话,一次读一个,读完写完,再读下一个
你用read(byte[])的话,是一次把n个字节存到byte[]中,再读,而这个读是在缓存中完成的。。

怎么说的 ,就像搬运转头一样,,你用人搬运呢,一次搬运一块要不停的来回的跑,
你可以用车去搬运呀,那一次可以搬运很多块,但我们别忘了,我们在装车的时候,也是要人一块的一块去装车的,,
不知道这么回…
[/Quote]
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
怎么个减少法, 比如一个文件1M 用read是1M次,用read(byte[])还是1M次呀?????
dracularking 2008-04-13
  • 打赏
  • 举报
回复
The read(b, off, len) method for class InputStream simply calls the method read() repeatedly.
按字节为最小单位读取 一旦发生异常 可以返回异常发生前所读
hmsuccess 2008-04-13
  • 打赏
  • 举报
回复
减少i/o操作次数啊,增快读写速度
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
我知道一次读bufsize 个会比较快,但是源码里面是这样的,我不大理解,就是上面的那个函数,似乎read(byte[])就是调用read()的循环来完成所谓的一次读取bufsize个字节,那…… 额 脑袋转不过来
「已注销」 2008-04-13
  • 打赏
  • 举报
回复
一次读入len长度的数据放到缓冲区中,这个一次怎么解释:

try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}

下面这个就是一次读,那这个和
[code=Java]
while(fin.read()!=-1)
{
...
}
[code]
有什么区别,不都一样
sky_ccy 2008-04-13
  • 打赏
  • 举报
回复
这俩个还是不一样的,兄弟,,
他是在缓存里面执行的,,
你用read去读的话,一次读一个,读完写完,再读下一个
你用read(byte[])的话,是一次把n个字节存到byte[]中,再读,而这个读是在缓存中完成的。。

怎么说的 ,就像搬运转头一样,,你用人搬运呢,一次搬运一块要不停的来回的跑,
你可以用车去搬运呀,那一次可以搬运很多块,但我们别忘了,我们在装车的时候,也是要人一块的一块去装车的,,
不知道这么回答,你可满意
hmsuccess 2008-04-13
  • 打赏
  • 举报
回复
read(byte[])他是一次读入len长度的数据放到缓冲区中,当然它返回的是读入到缓冲区中的字节数

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧