黑马程序员技术交流社区

标题: 复制图片问题 [打印本页]

作者: 郑小杰    时间: 2012-7-20 13:25
标题: 复制图片问题
/*
复制一个图片
思路:
1,用字节读取流对象和图片关联
2,用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3,通过循环读写,完成数据的存储
4,关闭资源
*/
import java.io.*;
class  CopyPic
{
public static void main(String[] args)
{
  FileOutputStream fos = null;
  FileInputStream fis = null;
  try
  {
   fos = new FileOutputStream("c:\\2.jpg");
   fis = new FileInputStream("c:\\1.jpg");
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read())!=-1)
   {
    fos.write(buf,0,len);
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("复制文件失败");
  }
  finally
  {
   try
   {
    if(fos!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
  
  try
   {
    if(fis!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
  
  }

}
}
上边的代码可以实现复制,但是复制出来的图片打不开,怎么回事?还有就是原来的图片只有20.1k  ,为什么复制出的有2.36M  ?试了几次都这样

作者: 周玉龙    时间: 2012-7-20 13:38
/*
复制一个图片
思路:
1,用字节读取流对象和图片关联
2,用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3,通过循环读写,完成数据的存储
4,关闭资源
*/
import java.io.*;
class  CopyPic
{
public static void main(String[] args)
{
  FileOutputStream fos = null;
  FileInputStream fis = null;
  try
  {
   fos = new FileOutputStream("c:\\2.jpg");
   fis = new FileInputStream("c:\\1.jpg");
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read(buf))!=-1)//哥们 这里注意了.你这里没写buf.没写buf就是一个字节一个字节的读取.读一个字节判断一次,是不是=-1不是就把1M的数组(没有内容的数组)写进去了.
                                              //所以你复制的文件打开不是图片,而且比原来的大
                                            //哥们你可害苦了我,你的目标文件小,一个字节一个字节的判断.很快就结束了,我的可是3M的图片这一个字节一个字节的判断,电脑风扇立马就嘎嘎的响起来了
   {
    fos.write(buf,0,len);
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("复制文件失败");
  }
  finally
  {
   try
   {
    if(fos!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
  
  try
   {
    if(fis!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
  
  }

}
}
作者: 程潇    时间: 2012-7-20 13:50
import java.io.*;
class  CopyPic
{
public static void main(String[] args)
{
  FileOutputStream fos = null;
  FileInputStream fis = null;
  try
  {
   fos = new FileOutputStream("c:\\2.jpg");
   fis = new FileInputStream("c:\\1.jpg");
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read())!=-1)    //这句有问题,fis.read()是读一个字节,返回的是下一个字节的数据,而不是读入到流中的字节数,你将下一个字节的数据赋给了len,下面的写入操作一定会出问题。
//另外,正确的操作应该是len=fis.read(buf)
   {
    fos.write(buf,0,len);  //由于上面的原因,写入的数据是从0到len的数据,上面取到的len所以你的图片会是2M多
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("复制文件失败");
  }
  finally
  {
   try
   {
    if(fos!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
  
  try
   {
    if(fis!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
  
  }

}
}

作者: 郑小杰    时间: 2012-7-20 14:52
周玉龙 发表于 2012-7-20 13:38
/*
复制一个图片
思路:

原来如此啊,谢了,哥们电脑没问题吧?




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