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循环的条件,有意义?
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())!=-1)来做判断而不用while(System.in.read()!=-1)来判断?
System.out.print(new String(buf,0,len));
}你这么写能编译么?
那buf已经满值了,你再收循环收1个字节
不就print出来100个字节了吗,并且后面那99个字节是上次收的!那个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循环退出,所以,不存在第三次)我这样解释,楼主明白了吗 ?
1.我忽略了后面要用到len这个参数,钻到牛角尖里了。
2.刚我试验了一下,(len=in.read(buf))这个表达式的结果就是len,就是while((len=in.read(buf))!=-1)这个语句判断的是len的值。
再次谢谢大家!liuqq218和preferme,特别谢谢你们!