黑马程序员技术交流社区

标题: 字节流拷贝图片 [打印本页]

作者: 歌诗王道    时间: 2014-4-18 19:20
标题: 字节流拷贝图片
本帖最后由 歌诗王道 于 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,怎么就够把两兆多的图片传过去了呢?

作者: ノtrack    时间: 2014-4-18 19:23
循环 直到读完文件为止
作者: 月光海    时间: 2014-4-18 19:24
  1. while((len= fis.read(buf))!=-1)
  2. {
  3.        fos.write(buf,0,len);
  4. }
复制代码
这个是循环执行的,每次copy一点,一直循环到原始数据被读完
作者: 曹冬明    时间: 2014-4-18 19:26
不是一次传一个文件过去,就像用水桶从井里将水打到水缸里,不是一次打一缸,又不能一瓢一瓢的,所以就用一个水桶,装满一桶再打往缸里装!缸就相当于目的,井就是源(这里就说井里只有一缸水啊,这个没必要较真),水桶就是缓冲区,瓢就是每次读到的字节。你会问我水桶那么小,能装下一缸水么,那我就不会了- -
作者: sheng6699    时间: 2014-4-18 19:28
while循环几次读过去了
作者: 不似侽紸角.    时间: 2014-4-18 19:32
您好,您定义的字节数组容量只有1024,那只是缓冲区,意思是读到1024就开始写入,while循环,知道文件读取完为止,你定义了多大的缓冲区,避免了读一点写一点的低效。
作者: ⒈心只霸占沵    时间: 2014-4-18 19:53
  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. }
复制代码

作者: z1342802487    时间: 2014-4-18 21:01
read方法详细是从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。
如果已到达文件末尾,则返回 -1。
程序是读一个1024,写也个1024。write一次,如果没有读完,while循环就会继续,read继续,直到读完返回-1。
作者: xtxiaolu    时间: 2014-4-18 21:18


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:19
xtxiaolu 发表于 2014-4-18 21:18
FileOutputStream fos = new FileOutputStream("c:\\2.bmp");
FileIntputStream fis = new FileIntputStr ...

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

将缓冲区设为1024字节是一个优化的选择,可以设置为任意的大小
作者: luoyilan222    时间: 2014-4-18 22:22
不是有循环嘛,每一次循环fis.read(buf))写到buf中,接着fos.write(buf,0,len);把buf中数据写到fos流中,这一过程不断循环,不就okl咯呀
作者: muma    时间: 2014-4-18 22:45
while((len= fis.read(buf))!=-1)是一个循环,每次读取1024.读完为止




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