关于在读取输入流时的while循环和read方法

bosi1221 2010-12-13 05:54:04
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循环的条件,有意义?
...全文
741 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bosi1221 2010-12-13
  • 打赏
  • 举报
回复
呵呵,谢谢大家。
1.我忽略了后面要用到len这个参数,钻到牛角尖里了。
2.刚我试验了一下,(len=in.read(buf))这个表达式的结果就是len,就是while((len=in.read(buf))!=-1)这个语句判断的是len的值。
再次谢谢大家!liuqq218和preferme,特别谢谢你们!
bosi1221 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 salever 的回复:]

while(System.in.read(buf)!=-1){
System.out.print(new String(buf,0,len));
}

你这么写能编译么?
[/Quote]
可以编译
冰思雨 2010-12-13
  • 打赏
  • 举报
回复
原因是后面循环体里面用到了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循环退出,所以,不存在第三次)

我这样解释,楼主明白了吗 ?
shaosijun2004 2010-12-13
  • 打赏
  • 举报
回复
System.out.print(new String(buf,0,len));

同学,这里,如果前面收了100字节
那buf已经满值了,你再收循环收1个字节
不就print出来100个字节了吗,并且后面那99个字节是上次收的!那个len是用于字符串输出的,这样数据就不会出错了
liuqq218 2010-12-13
  • 打赏
  • 举报
回复
多个len,主要是read()方法返回读取了总字节数,在打印的时候方便打印byte[]时指定有效数据长度
salever 2010-12-13
  • 打赏
  • 举报
回复
while(System.in.read(buf)!=-1){
System.out.print(new String(buf,0,len));
}

你这么写能编译么?
caofaping 2010-12-13
  • 打赏
  • 举报
回复
多个len,主要是read()方法返回读取了总字节数,在打印的时候方便打印byte[]时指定有效数据长度
bosi1221 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dyllove98 的回复:]

while((len=System.in.read(buf))!=-1)

循环从 命令行去数据
它的值是你输入的键盘字符 如果什么都不输入的话 就是-1
[/Quote]

可能你没看清楚我的问题,我的疑问是
为什么用while((len=System.in.read())!=-1)来做判断而不用while(System.in.read()!=-1)来判断?
Jlins 2010-12-13
  • 打赏
  • 举报
回复
while((len=System.in.read(buf))!=-1)

循环从 命令行去数据
它的值是你输入的键盘字符 如果什么都不输入的话 就是-1
Python编程基础教程本教程旨在帮助初学者了解Python编程的基础知识和高级应用。我们将介绍Python的各个方面,包括基础语法、数据类型、控制结构、函数、文件操作、面向对象编程、模块和包、异常处理、装饰器、生成器、迭代器以及协程。1. Python基础Python是一种解释型、交互式的编程语言。它具有简单易学的语法和丰富的库,使得开发过程既快速又高效。在开始学习Python之前,建议您先熟悉基本的计算机科学概念,例如变量、数据类型、运算符等。2. 数据类型Python具有多种数据类型,包括数字(整数和浮点数)、字符串、布尔值、列表、元组、集合和字典等。这些数据类型在Python中有着广泛的应用,从简单的数值计算到复杂的数据处理。3. 控制结构控制结构是编程中的基本组成部分,它们决定了程序如何执行。Python支持条件语句(if-elif-else)和循环语句(for和while),可以根据程序中的特定条件和情况来选择适当的操作。4. 函数函数是封装一段代码的便捷方式,它们可以在需要时被调用。在Python中,您可以定义函数,并使用参数来传递数据。函数可以返回值,以便在调用它们时使用。5. 文件操作文件操作是编程中常见的任务之一。Python提供了许多内置的函数和方法来进行文件操作,如读取、写入和删除文件等。此外,Python还支持对文件进行高级操作,如读写二进制文件、文件锁定等。6. 面向对象编程面向对象编程是一种流行的编程范式,它使用类和对象的概念来构建复杂的系统。Python支持面向对象编程,您可以使用类来定义对象,并使用继承和多态等特性来扩展和定制对象的行为。7. 模块和包模块和包是Python中组织代码的重要工具。模块是一个包含Python代码的文件,而包则是一个包含多个模块的目录。通过使用模块和包,您可以轻松地组织和管理大型项目中的代码。8. 异常处理异常处理是Python中处理错误的方式之一。当程序中出现错误时,Python会抛出一个异常。通过使用try-except语句块,您可以捕获并处理这些异常,以确保程序的稳定性。9. 装饰器装饰器是Python中的高级功能之一,它允许您在函数或方法之间添加额外的功能,而不改变其原始实现。装饰器是一种强大的工具,可用于实现各种功能,如日志记录、性能分析等。10. 生成器生成器是Python中的一种特殊类型的迭代器。通过使用生成器函数和方法,您可以在需要时生成数据,而不是一次性生成所有数据。这使得生成器在处理大量数据时非常有用,因为它们可以节省内存空间。11. 迭代器和协程迭代器和协程是Python中的两个重要概念。迭代器允许您遍历容器类型的数据结构(如列表和元组),而协程则是一种异步编程的方式,它允许您在程序中执行多个任务并发执行。这两个概念在处理大量数据和高性能应用程序方面非常有用。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧