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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈晓东 黑马帝   /  2011-10-4 18:20  /  2049 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]File dir = new File("c:\\pic");
                        File file = new File(dir,ip+"("+(++count)+").jpg");

                        while(file.exists())
                                file = new File(dir,ip+"("+(++count)+").jpg");

                        InputStream in = s.getInputStream();

                        FileOutputStream fos = new FileOutputStream(file);

                        OutputStream out = s.getOutputStream();

                        byte[] buf = new byte[1024*4];

                        int len = 0;

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

                        out.write("上传成功".getBytes());

                        fos.close();
                        s.close();[/code]以上是一个代码中的部分代码,我想请教的是 关于while((len=in.read(buf))!=-1)这部分 这个返回的len倒是是什么值,是不是存入到数组中有效数据的角标值?如果是角标值的话,那么为什么还要判断!=-1呢?如果没有数据的话就不往数组里面存了。是不是在底层调用的时候这样定义的?如果是的话,能不能把底层调用的原理给我讲一下了,谢谢。

3 个回复

倒序浏览
黑马网友  发表于 2011-10-4 21:14:31
沙发
in.read()是InputStream类的一个方法,jdk说明文档对此方法的详解为:
从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。
回复 使用道具 举报
3楼所说的是public int read()这个方法 而我所说的是public int read(byte[] b)这两个是不一样的
public int read()这个底层原理如下:[code=java]import java.io.*;

class MyBufferedInputStream
{
        private InputStream in;

        private byte[] buf = new byte[1024*4];

        private int pos = 0;
        private int len = 0;

        MyBufferedInputStream(InputStream in)
        {
                this.in = in;
        }

        public int myRead()throws IOException
        {
                if(len==0)
                {
                        len = in.read(buf);//这个len就是读取到的有效数据的总长度。
                        if(len<0)
                                return -1;
                        
                        pos=0;
                        byte b = buf[pos];

                        //System.out.println("b="+b);
                        pos++;
                        len--;
                        return b&0xff;//为了避免读取到的字节与-1的2进制一样,所以&255.
                }
                else if( len>0)
                {
                        byte b = buf[pos];
                        pos++;
                        len--;
                        return b&255;
                }
                return -1;

        }
        public void myClose()throws IOException
        {
                in.close();
        }
}[/code]所以read()这个方法的返回值在0到255的int 字节值
由write(byte[] b, int off, int len)(注释:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。)方法中可以看出len还是有效数据的长度。所以2楼给的解释很合理。谢谢了。还是要多看API啊。哎,本来一个很好理解的东西被我搞复杂了。
[ 本帖最后由 陈晓东 于 2011-10-04  22:17 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马