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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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有些不一样,且图片大小也不一样,是哪里出问题呢?为什么会出现这种问题呢?

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

2 个回复

倒序浏览

  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.         }
复制代码
回复 使用道具 举报
因为你使用的是带缓冲的输入输出流,相当于为InputStream,OutputStream类增加缓冲区功能,此时读写中间都要经过缓冲区,所以在使用write()方法写入输出流时实际上是先将数据写入缓冲区中,等缓冲区写满之后再一次性写入磁盘,这就是为什么你复制后的图片损失了一部分的原因,因为最后一次写入缓冲区时没有将缓冲区写满,因此缓冲区中的那些内容也就不会写入到磁盘。

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

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

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马