int len = 0 ; 
byte[] buf = new byte[100];
while((len=System.in.read(buf))!=-1){
    System.out.print(new String(buf,0,len));
}这是一段读取键盘输入并打印到屏幕的程序,在while循环里我一直不明白为什么要加上(len=System.in.read(buf))!=-1
来做判断,按照我的理解,read(byte [])方法,本身就返回了一个整型变量,我直接这样写:
while(System.in.read(buf)!=-1){
    System.out.print(new String(buf,0,len));
}
不就已经把判断的条件写的很明白了吗,可是这样写运行之后发现并没有出现我想要的结果。
另外,len=System.in.read(buf)本身是一个赋值语句,它的返回值是什么?用它和-1比较来作为while循环的条件,有意义?

解决方案 »

  1.   

    while((len=System.in.read(buf))!=-1)循环从 命令行去数据
    它的值是你输入的键盘字符 如果什么都不输入的话 就是-1
      

  2.   


    可能你没看清楚我的问题,我的疑问是
    为什么用while((len=System.in.read())!=-1)来做判断而不用while(System.in.read()!=-1)来判断?
      

  3.   

    多个len,主要是read()方法返回读取了总字节数,在打印的时候方便打印byte[]时指定有效数据长度
      

  4.   

    while(System.in.read(buf)!=-1){
      System.out.print(new String(buf,0,len));
    }你这么写能编译么?
      

  5.   

    多个len,主要是read()方法返回读取了总字节数,在打印的时候方便打印byte[]时指定有效数据长度
      

  6.   

    System.out.print(new String(buf,0,len));同学,这里,如果前面收了100字节
    那buf已经满值了,你再收循环收1个字节
    不就print出来100个字节了吗,并且后面那99个字节是上次收的!那个len是用于字符串输出的,这样数据就不会出错了
      

  7.   

    原因是后面循环体里面用到了len变量。
    在while循环的条件语句里面,len变量进行了赋值。问题的关键,是要理解InputStream.read方法,它的返回值的含义。
    拿向缓冲区读取数据为例(也就是楼主的那个例子):
    int len = 0 ; //这个变量,应该是,表示已经读取的有效字节数。
    byte[] buf = new byte[100];//这是创建一个100字节的缓冲区,用来存放将要读取的数据。
    while((len=System.in.read(buf))!=-1){
      System.out.print(new String(buf,0,len));//将缓冲区中有效的字节数据形成字符串,并打印到控制台。
    }
    关键的 System.in.read(buf) 方法,它的返回值是:
    1.当输入流不是末尾时,返回填充至缓冲区的字节数;
    2.当输入流已经是末尾(输入流已经结束)时,返回-1。具体来讲,如果输入流中,一共有150个字节。
    那么,上述代码的循环结构,执行2次。
    第一次,len=100;第二次,len=50.(第三次由于len=-1循环退出,所以,不存在第三次)我这样解释,楼主明白了吗 ?
      

  8.   

    呵呵,谢谢大家。
    1.我忽略了后面要用到len这个参数,钻到牛角尖里了。
    2.刚我试验了一下,(len=in.read(buf))这个表达式的结果就是len,就是while((len=in.read(buf))!=-1)这个语句判断的是len的值。
    再次谢谢大家!liuqq218和preferme,特别谢谢你们!