为了账号安全,请及时绑定邮箱和手机立即绑定

out.write(buf, 0, b);//这个b什么意思?写b个长度的字节吗?但是没有给b赋值啊

public static void copyFile(File scrFile,File destFile) throws IOException{

if(!scrFile.exists()){

throw new IllegalArgumentException("文件"+scrFile+"不存在");

}

if(!scrFile.isFile()){

throw new IllegalAccessError(scrFile+"不是文件");

       }

FileInputStream in = new FileInputStream(scrFile);

FileOutputStream out = new FileOutputStream(destFile);

byte [] buf = new byte[8*1024];

int b;

while((b=in.read(buf,0,buf.length))!=-1){

out.write(buf, 0, b);//这个b什么意思?写b个长度的字节吗?但是没有给b赋值啊

out.flush(); //通过将所有已缓冲输出写入底层流来刷新此流

}

in.close();

out.close();

}


正在回答

2 回答

如果文件很小,你申请的容量8*1024个byte的数组就已经可以完全装下,很显然那么第一次读就一下把文件读完了;

如果文件很大,你申请的容量一次读取装不完时,那就会有下一次读取,直到读到文件的末尾,此时返回-1,就跳出循环了;

read(buf,0,buf.length)意思是一次最多读取的字节数不超过8*1024,即<=8*1024.

看一下这个方法的官方文档解释,你就会更加明白了.

     *Reads up to <code>len</code> bytes of data from this input stream

     * into an array of bytes. If <code>len</code> is not zero, the method

     * blocks until some input is available; otherwise, no

     * bytes are read and <code>0</code> is returned.

1 回复 有任何疑惑可以回复我~
#1

qq_星尘_8 提问者

非常感谢!
2017-01-05 回复 有任何疑惑可以回复我~
#2

qq_星尘_8 提问者

如果装不完,那么是在下一次装之前就写入了已经装满的一部分吗,这意思就是分批写入的吧
2017-01-05 回复 有任何疑惑可以回复我~
#3

Manny2011 回复 qq_星尘_8 提问者

对,你申请的数组就是一个临时的容器,可以重复使用,实现分批次写入到输出流中.
2017-01-07 回复 有任何疑惑可以回复我~
查看1条回复

b=in.read(buf,0,buf.length)就是在给b赋值,返回一个int 型的数,意思是,read方法从流中一次所读到的字节数.

0 回复 有任何疑惑可以回复我~
#1

qq_星尘_8 提问者

那b用read方法一次读取多少字节数呢?还是说一下就读取总长度的字节了
2017-01-05 回复 有任何疑惑可以回复我~
#2

qq_星尘_8 提问者

是不是读取的长度为开辟的缓冲流大小,如果小了就一下读完,如果大了就先读满,再读一次,直到读完?
2017-01-05 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

out.write(buf, 0, b);//这个b什么意思?写b个长度的字节吗?但是没有给b赋值啊

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信