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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付建超 中级黑马   /  2013-9-8 10:00  /  1182 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 付建超 于 2013-9-8 10:41 编辑

try
                {
                        fos = new FileOutputStream("bb.bmp");
                        fis = new FileInputStream("aa.bmp");

                        byte[] buf = new byte[1024];

                        int len = 0;

                        while((len=fis.read(buf))!=-1)
                        {
                                fos.write(buf,0,len);
                        }
                }

这里的1.bmp有4M大小,缓冲区buf设置的大小不到4M,循环一次后,len又是0了??突然一下子脑残。。。可以解释一下吗{:soso_e117:}

评分

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

查看全部评分

4 个回复

倒序浏览
说实在的,没看懂楼主问的问题是什么意思哈。。fis.read(buf)会读取不超过数组长度那么多个字节数据进入数组中。然后就会把读取数据的个数返回,并让len接收,当循环内的条件表达式运算完毕之后,就表示fis.read(buf)运行了一次,如果返回来的结果不是-1,就表示数据还没有读取完。完后就进入到了循环内部,fos.write(buf,0,len);就通过输出流的write方法,将字节数组输出,因为可能字节数组内的数据并不足1024个,所以就定义其输出的是从0开始,输出len个数据。因为len是上面读取个数的返回值。肯定不会错的。
不知道这样解释楼主能不能明白

评分

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

查看全部评分

回复 使用道具 举报
因为是循环输出,第一次取1024个字节,while((len=fis.read(buf))!=-1)会一直判断,然后再从0开始取出数据。
你也可以使用available()来获取文件大小,然后直接按文件大小来一次性传输。但是文件不要太大,超了了内存可以不好。

评分

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

查看全部评分

回复 使用道具 举报
gulup 发表于 2013-9-8 10:16
说实在的,没看懂楼主问的问题是什么意思哈。。fis.read(buf)会读取不超过数组长度那么多个字节数据进入数 ...

我知道了,谢谢哈。。。正在努力看呢
回复 使用道具 举报
mo﹎雲℡ 发表于 2013-9-8 10:18
因为是循环输出,第一次取1024个字节,while((len=fis.read(buf))!=-1)会一直判断,然后再从0开始取出数据 ...

谢谢啦!明白了。。。一起努力哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马