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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© serioustd 中级黑马   /  2014-4-26 21:17  /  1788 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.a.io;
import java.io.*;

public class CopyPic {
        public static void main(String[] args) {
                FileOutputStream fos= null;
                FileInputStream fis =null;
                try
                {
                        fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\eq\\新建文件夹\\6.bmp");
                        fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\eq\\新建文件夹\\o.bmp");
                        int num=fis.available();
                        byte[] buf=new byte[num];
                        int len=0;
                        while((len=fis.read())!=-1)
                        {
                                fos.write(buf,0,len);
                        }
                }
                catch(IOException e)
                {
                        System.out.println("复制文件失败");
                }
                finally
                {
                        try
                        {
                                if(fis!=null)
                                        fis.close();                       
                        }catch(IOException e)
                        {
                                System.out.println("关闭读取字节流失败");
                        }
                        try
                        {
                                if(fos!=null)
                                        fos.close();                       
                        }catch(IOException e)
                        {
                                System.out.println("关闭写入字节流失败");
                        }
                }
        }       
}
图片拷贝是拷贝了,但是图片打不开,图片可能损坏.损毁或过大,拷贝的图片内存比实际的内存要大出好多

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

17 个回复

倒序浏览
应该是未刷新字节流
回复 使用道具 举报
SyouRai_Tsk 发表于 2014-4-26 21:45
应该是未刷新字节流

字节流是不需要刷新的
回复 使用道具 举报
本帖最后由 今生无憾 于 2014-4-26 21:58 编辑

int num=fis.available();
                        byte[] buf=new byte[num];
                        int len=0;
                        while((len=fis.read())!=-1)
                        {
                                fos.write(buf,0,len);
                        }
问题出现在这一段,首先你用的是available()方法,这是把图片剩下的字节全部读出来,你用byte数组存储,在下面的循环里,循环了很多次,也就是写了很多次num大小的byte数组。自然就会出现复制后的图片大很多。而且无法显示了。
建议你去回顾下自学视频里的IO流,你拷贝图片的方式弄错了。 你创建一个byte数组,给定一个大小。512字节。1024字节等等随你。然后每次循环读取byte数组大小的字节,就写入进去。直到读完。就OK了。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
今生无憾 发表于 2014-4-26 21:52
int num=fis.available();
                        byte[] buf=new byte[num];
                         ...

有点含糊,我没懂
回复 使用道具 举报

                      byte[] buf=new byte[512];
                        int len=0;
                        while((len=fis.read(buf))!=-1)
                        {
                                fos.write(buf);
                        }
回复 使用道具 举报
今生无憾 发表于 2014-4-26 22:02
byte[] buf=new byte[512];
                        int len=0;
                ...

哦,我找到问题拉,是我buf数组,没有放到while循环里进行判断所导致,3q
回复 使用道具 举报
  1.     try
  2.                 {
  3.                         fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\eq\\新建文件夹\\6.bmp");
  4.                         fis=new FileInputStream("C:\\Users\\Administrator\\Desktop\\eq\\新建文件夹\\o.bmp");
  5.                         int num=fis.available();
  6.                         byte[] buf=new byte[num];
  7.                         int len=0;
  8.                         while((len=fis.read()!=-1)  //同学  你这个read()方法里面漏传个数组了fis.read([color=Red]buf[/color]))
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
while((len=fis.read(buf)!=-1)
回复 使用道具 举报 1 0
serioustd 发表于 2014-4-26 21:47
字节流是不需要刷新的

未看清楚.具体问题出在那个available()方法
回复 使用道具 举报
SyouRai_Tsk 发表于 2014-4-26 22:21
未看清楚.具体问题出在那个available()方法

跟avaibale()方法没有关系呀,只不过是num数组没有传递,我现在用了avaibale()方法也能成功
回复 使用道具 举报
代码出现的问题在这里:
  1.    int num=fis.available();
  2.                         byte[] buf=new byte[num];
  3.                         int len=0;
  4.                         while((len=fis.read())!=-1)
  5.                         {
  6.                                 fos.write(buf,0,len);
  7.                         }
复制代码

你调用的是read方法,该方法是一次读取一个字节并写入到输出流,你这个len定义的也就有问题了,既然是一次读取一个字节,那么fis.read()应该是一个int类型的数值,而不是长度,可以直接写:fos.write(fis.read);或者定义一个有意义的int变量接收返回值。
这种方式复制图片的效率很低,你可以通过定义缓冲区的方式,这样可以减少while循环执行的次数,提高程序的性能,减少不必要的内存消耗。
希望会对楼主有用吧~

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
serioustd 发表于 2014-4-26 22:24
跟avaibale()方法没有关系呀,只不过是num数组没有传递,我现在用了avaibale()方法也能成功 ...

刚发现,有点感觉自己一下子抽了
回复 使用道具 举报
搜噶!搜噶!搜噶!搜噶!搜噶!
回复 使用道具 举报
大哥。能不能加个注释啊。看得好累哦。
回复 使用道具 举报

                        while ((len=fis.read(buf)!=-1)
                        {
                                fos.write(buf,0,len);
                        }
记得把数组传进去。。。
回复 使用道具 举报
while((len=fis.read())!=-1)  你读的是那个数组没有写进去啊!
回复 使用道具 举报
while((len=fis.read())!=-1)//这里写错了,你没把数组传进去
                        {
                                fos.write(buf,0,len);
                        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马