黑马程序员技术交流社区

标题: 为何复制的图片打不开 [打印本页]

作者: 付欢    时间: 2015-6-5 21:36
标题: 为何复制的图片打不开
代码如下,复制出来的图片比原来图片大,并且新图片无法打开
  1. import java.io.*;

  2. public class CopyPicture
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 FileOutputStream fos = null;
  7.                 FileInputStream fis = null;  
  8.                
  9.                 try
  10.                 {
  11.                         fos = new FileOutputStream("d:\\B\\33.jpg");
  12.                         fis = new FileInputStream("d:\\B\\32.jpg");
  13.                         byte[] buf = new byte[1024];
  14.                         int len = 0;
  15.                         while((len=fis.read())!=-1)
  16.                         {
  17.                                 fos.write(buf, 0, len);
  18.                         }
  19.                 }
  20.                 catch(IOException e)
  21.                 {
  22.                         throw new RuntimeException("复制图片失败");
  23.                 }
  24.                 finally
  25.                 {
  26.                         try
  27.                         {
  28.                                 if(fis!=null)
  29.                                         fis.close();
  30.                         }
  31.                         catch(IOException e)
  32.                         {
  33.                                 throw new RuntimeException("读取图片失败");
  34.                         }
  35.                         try
  36.                         {
  37.                                 if(fos!=null)
  38.                                         fos.close();
  39.                         }
  40.                         catch(IOException e)
  41.                         {
  42.                                 throw new RuntimeException("写入图片失败");
  43.                         }
  44.                        
  45.                 }
  46.                
  47.                
  48.                
  49.                
  50.                
  51.         }
  52. }
复制代码




作者: 半月    时间: 2015-6-5 21:49
while((len=fis.read())!=-1)
你读取的数据要保存到你的byte数组中
fos.write(buf, 0, len);
要不你写入的数据都是空的
而且写入后要刷新缓冲区
作者: 学前程序员    时间: 2015-6-5 21:52
while((len=fis.read())!=-1) 你读取的数据要保存到你的byte数组中 fos.write(buf, 0, len); 要不你写入的数据都是空的 而且写入后要刷新缓冲区
作者: edithe    时间: 2015-6-5 21:59
本帖最后由 edithe 于 2015-6-5 22:04 编辑
  1. while((len = fis.read(buf)))
复制代码

把读到的数据放数组中 read()方法只是一次读一个字节,没有存储,你把buf写出去,但是里面有什么呢

作者: wang649557111    时间: 2015-6-5 21:59
赞一个。。。。。。。。。。
作者: 城北一直晴。    时间: 2015-6-5 22:04
赞一个,加油!
作者: 途中ms前进    时间: 2015-6-5 23:04
flush()一下
作者: Himoriarty    时间: 2015-6-5 23:28
我运行了你的程序抛出的是异常:
Exception in thread "main" java.lang,RuntimeException:复制图片失败
                    at CopyPicture.main(CopyPicture.java:23)
因为你的这条语句while((len=fis.read())!=-1)
这个语句中的read()方法是读取输入流中的一个字节,并没有将读取到的字节数据存入缓冲区,但是你在循环中又写了write(buf,0,len)语句,此时buf字节数组内为空,不会写出数据,所以抛出了异常。
作者: Himoriarty    时间: 2015-6-5 23:31
途中ms前进 发表于 2015-6-5 23:04
flush()一下

这个不用flush,因为没存入一次缓冲区就会写出一次,再存入缓冲区内容的时候前面的会被覆盖掉,再写出。
作者: Himoriarty    时间: 2015-6-5 23:39
途中ms前进 发表于 2015-6-5 23:04
flush()一下

这个是字节流,直接写到了硬盘上,不象字符流中的缓存技术一样,write方法是将数据写入到了缓冲区,可以一直存,需要刷新一下缓冲区才可以写到磁盘上。
作者: kmlitheima    时间: 2015-6-6 00:13
这是一个码制问题吧!
作者: 武汉小菜鸟    时间: 2015-6-6 00:39
这里用的是字节流,不用刷新缓冲区
作者: 追忆似水年华    时间: 2015-6-6 12:00
while()中要reader(buf);
作者: 付欢    时间: 2015-6-6 14:55
追忆似水年华 发表于 2015-6-6 12:00
while()中要reader(buf);

是的,修改后可以了
作者: 付欢    时间: 2015-6-6 14:56
Himoriarty 发表于 2015-6-5 23:28
我运行了你的程序抛出的是异常:
Exception in thread "main" java.lang,RuntimeException:复制图片失败
   ...

是的,修改后可以运行了




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