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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付欢 中级黑马   /  2015-6-5 21:36  /  1030 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下,复制出来的图片比原来图片大,并且新图片无法打开
  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. }
复制代码



14 个回复

倒序浏览
while((len=fis.read())!=-1)
你读取的数据要保存到你的byte数组中
fos.write(buf, 0, len);
要不你写入的数据都是空的
而且写入后要刷新缓冲区
回复 使用道具 举报
while((len=fis.read())!=-1) 你读取的数据要保存到你的byte数组中 fos.write(buf, 0, len); 要不你写入的数据都是空的 而且写入后要刷新缓冲区
回复 使用道具 举报
本帖最后由 edithe 于 2015-6-5 22:04 编辑
  1. while((len = fis.read(buf)))
复制代码

把读到的数据放数组中 read()方法只是一次读一个字节,没有存储,你把buf写出去,但是里面有什么呢
回复 使用道具 举报
赞一个。。。。。。。。。。
回复 使用道具 举报
赞一个,加油!
回复 使用道具 举报
flush()一下
回复 使用道具 举报
我运行了你的程序抛出的是异常:
Exception in thread "main" java.lang,RuntimeException:复制图片失败
                    at CopyPicture.main(CopyPicture.java:23)
因为你的这条语句while((len=fis.read())!=-1)
这个语句中的read()方法是读取输入流中的一个字节,并没有将读取到的字节数据存入缓冲区,但是你在循环中又写了write(buf,0,len)语句,此时buf字节数组内为空,不会写出数据,所以抛出了异常。
回复 使用道具 举报

这个不用flush,因为没存入一次缓冲区就会写出一次,再存入缓冲区内容的时候前面的会被覆盖掉,再写出。
回复 使用道具 举报

这个是字节流,直接写到了硬盘上,不象字符流中的缓存技术一样,write方法是将数据写入到了缓冲区,可以一直存,需要刷新一下缓冲区才可以写到磁盘上。
回复 使用道具 举报
这是一个码制问题吧!
回复 使用道具 举报
这里用的是字节流,不用刷新缓冲区
回复 使用道具 举报
while()中要reader(buf);
回复 使用道具 举报
追忆似水年华 发表于 2015-6-6 12:00
while()中要reader(buf);

是的,修改后可以了
回复 使用道具 举报
Himoriarty 发表于 2015-6-5 23:28
我运行了你的程序抛出的是异常:
Exception in thread "main" java.lang,RuntimeException:复制图片失败
   ...

是的,修改后可以运行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马