黑马程序员技术交流社区

标题: 字节流小问题。。。帮一下吗 [打印本页]

作者: 付建超    时间: 2013-9-8 10:00
标题: 字节流小问题。。。帮一下吗
本帖最后由 付建超 于 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:}


作者: gulup    时间: 2013-9-8 10:16
说实在的,没看懂楼主问的问题是什么意思哈。。fis.read(buf)会读取不超过数组长度那么多个字节数据进入数组中。然后就会把读取数据的个数返回,并让len接收,当循环内的条件表达式运算完毕之后,就表示fis.read(buf)运行了一次,如果返回来的结果不是-1,就表示数据还没有读取完。完后就进入到了循环内部,fos.write(buf,0,len);就通过输出流的write方法,将字节数组输出,因为可能字节数组内的数据并不足1024个,所以就定义其输出的是从0开始,输出len个数据。因为len是上面读取个数的返回值。肯定不会错的。
不知道这样解释楼主能不能明白
作者: mo﹎雲℡    时间: 2013-9-8 10:18
因为是循环输出,第一次取1024个字节,while((len=fis.read(buf))!=-1)会一直判断,然后再从0开始取出数据。
你也可以使用available()来获取文件大小,然后直接按文件大小来一次性传输。但是文件不要太大,超了了内存可以不好。
作者: 付建超    时间: 2013-9-8 10:28
gulup 发表于 2013-9-8 10:16
说实在的,没看懂楼主问的问题是什么意思哈。。fis.read(buf)会读取不超过数组长度那么多个字节数据进入数 ...

我知道了,谢谢哈。。。正在努力看呢

作者: 付建超    时间: 2013-9-8 10:29
mo﹎雲℡ 发表于 2013-9-8 10:18
因为是循环输出,第一次取1024个字节,while((len=fis.read(buf))!=-1)会一直判断,然后再从0开始取出数据 ...

谢谢啦!明白了。。。一起努力哈





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