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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 歌诗王道 中级黑马   /  2014-4-18 19:20  /  1539 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 歌诗王道 于 2014-4-21 18:34 编辑

FileOutputStream fos = new FileOutputStream("c:\\2.bmp");
FileIntputStream fis = new FileIntputStream("c:\\1.bmp");
byte[] buf = new byte[1024];
int len = 0;
while((len= fis.read(buf))!=-1)
{
       fos.write(buf,0,len);
}
这是毕老师关于字符流拷贝图片的部分代码,c盘中有一个1.bmp的图片,大小是二点多兆的,可是定义的字节数组容量只有1024,怎么就够把两兆多的图片传过去了呢?

点评

再仔细看下毕老师视频吧!!!  发表于 2014-4-18 19:44

13 个回复

倒序浏览
循环 直到读完文件为止
回复 使用道具 举报
  1. while((len= fis.read(buf))!=-1)
  2. {
  3.        fos.write(buf,0,len);
  4. }
复制代码
这个是循环执行的,每次copy一点,一直循环到原始数据被读完
回复 使用道具 举报
不是一次传一个文件过去,就像用水桶从井里将水打到水缸里,不是一次打一缸,又不能一瓢一瓢的,所以就用一个水桶,装满一桶再打往缸里装!缸就相当于目的,井就是源(这里就说井里只有一缸水啊,这个没必要较真),水桶就是缓冲区,瓢就是每次读到的字节。你会问我水桶那么小,能装下一缸水么,那我就不会了- -
回复 使用道具 举报 1 0
while循环几次读过去了
回复 使用道具 举报
您好,您定义的字节数组容量只有1024,那只是缓冲区,意思是读到1024就开始写入,while循环,知道文件读取完为止,你定义了多大的缓冲区,避免了读一点写一点的低效。
回复 使用道具 举报
  1. //假如说你的图片有5124个字节
  2. FileOutputStream fos = new FileOutputStream("c:\\2.bmp");
  3. FileIntputStream fis = new FileIntputStream("c:\\1.bmp");
  4. byte[] buf = new byte[1024];//这里定义的字节数组是1024,它如果装满了能装1024个字节
  5. int len = 0;//它用来记录每次读取的字节数,假如你第一次读取到了1024个字节,len就等于1024,如果你只读了1000个字节len就等于1000
  6. while((len= fis.read(buf))!=-1)//这个循环用来循环读取,第一次读1024个,剩下的就是5124-1024, 再次循环,再读就是 (5124-1024)-1024 依次类推,一直读到结束
  7. {      
  8.         //每一次循环,就将读取的字节写入流中,意思就是读一次,写一次,假如你最后一次就剩下23个字节,那么len就等23这个方法就写23个字节
  9.         fos.write(buf,0,len);
  10. }
复制代码
回复 使用道具 举报
read方法详细是从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。
如果已到达文件末尾,则返回 -1。
程序是读一个1024,写也个1024。write一次,如果没有读完,while循环就会继续,read继续,直到读完返回-1。
回复 使用道具 举报


FileOutputStream fos = new FileOutputStream("c:\\2.bmp");
FileIntputStream fis = new FileIntputStream("c:\\1.bmp");
byte[] buf = new byte[1024*8];       //这样会快一些靠大的东西能看的出来或[1024*1024]能乘很多
int len = 0;
while((len= fis.read(buf))!=-1)
{
       fos.write(buf,0,len);
}

也有好多方法可以,纠正一下这是字节流不是字符流,字符流是不可以拷贝图片的,只能拷贝文档.
回复 使用道具 举报
xtxiaolu 发表于 2014-4-18 21:18
FileOutputStream fos = new FileOutputStream("c:\\2.bmp");
FileIntputStream fis = new FileIntputStr ...

这个肯定能考过去 因为他有循环!只是快慢的问题
回复 使用道具 举报
FileInputStream类中的read方法可以接受字节数组作为参数,read(byte[] b) ,从输入流中将最多 b.length 个字节的数据读入一个 byte 数组中,read方法是阻塞式方法,没有输入可用时,将一直等待,直到文件结尾,所以可以用while循环一直读取。read方法返回读入缓冲区的字节总数,如果读到文件结尾返回-1,可以作为结束标记

将缓冲区设为1024字节是一个优化的选择,可以设置为任意的大小
回复 使用道具 举报
不是有循环嘛,每一次循环fis.read(buf))写到buf中,接着fos.write(buf,0,len);把buf中数据写到fos流中,这一过程不断循环,不就okl咯呀
回复 使用道具 举报
muma 中级黑马 2014-4-18 22:45:06
13#
while((len= fis.read(buf))!=-1)是一个循环,每次读取1024.读完为止
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马