黑马程序员技术交流社区

标题: 关于复制图片的问题,大家看一下。。。 [打印本页]

作者: 蔡先苼    时间: 2014-5-5 22:18
标题: 关于复制图片的问题,大家看一下。。。
private static void copyPic1() throws IOException {
               
                FileInputStream fis=new FileInputStream("temp\\0.png");
                FileOutputStream fos=new FileOutputStream("temp\\1.png");
               
                BufferedInputStream bufis=new BufferedInputStream(fis);
                BufferedOutputStream bufos=new BufferedOutputStream(fos);
               
                int by=0;
                while((by=bufis.read())!=-1){
                        bufos.write(by);
                }
                fis.close();
                fos.close();
        }
用这种方法复制出的照片1.png相较于0.png有些不一样,且图片大小也不一样,是哪里出问题呢?为什么会出现这种问题呢?


作者: 程序爱好者    时间: 2014-5-5 22:48

  1. private static void copyPic1() throws IOException {
  2.                
  3.                 FileInputStream fis=new FileInputStream("temp\\0.png");
  4.                 FileOutputStream fos=new FileOutputStream("temp\\1.png");
  5.                
  6.                 BufferedInputStream bufis=new BufferedInputStream(fis);
  7.                 BufferedOutputStream bufos=new BufferedOutputStream(fos);
  8.                
  9.                 int by=0;
  10.                 while((by=bufis.read())!=-1){
  11.                         bufos.write(by);
  12.                        bufos.flush();//你忘记刷新了,这个是关键啊
  13.                 }
  14.                 fis.close();
  15.                 fos.close();
  16.         }
复制代码

作者: jieyu90    时间: 2014-5-5 22:51
因为你使用的是带缓冲的输入输出流,相当于为InputStream,OutputStream类增加缓冲区功能,此时读写中间都要经过缓冲区,所以在使用write()方法写入输出流时实际上是先将数据写入缓冲区中,等缓冲区写满之后再一次性写入磁盘,这就是为什么你复制后的图片损失了一部分的原因,因为最后一次写入缓冲区时没有将缓冲区写满,因此缓冲区中的那些内容也就不会写入到磁盘。

所以一般为了确保缓冲区中的数据一定被写入输出流,建议写入完成之后执行flush()将缓冲区中的数据全部写到输出流中。

你在fis.close();之前加上bufos.flush();试试




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