关于JAVA,System.in如何执行的问题。

importjava.io.*;publicclassTestTransForm2{publicstaticvoidmain(Stringargs[]){InputStr... import java.io.*;
public class TestTransForm2 {
public static void main(String args[]) {
InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = null;
try {
s = br.readLine();
while(s!=null){
if(s.equalsIgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
s = br.readLine();
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}

这个程序将输入的小写转为大写输出,我输入hello执行 System.out.println(s.toUpperCase());后输出HELLO,此时程序停留,等待继续输入。
再执行 s = br.readLine();这个时候我还没有输入,此时 s 到底是指向什么字符串。如果是hello,那难道不是不停循环输出HELLO吗?如果指向是NULL,那么就应该直接退出。实际情况是既不是死循环又没退出,此时我还可以继续输入新的字符串,难道程序又跳到System.in吗?。请问这个程序是如何执行的。
展开
 我来答
百度网友832bd6a
2012-05-18 · TA获得超过1180个赞
知道小有建树答主
回答量:422
采纳率:0%
帮助的人:408万
展开全部
1. 此时我还可以继续输入新的字符串,难道程序又跳到System.in吗?

你要知道 IO inputStream outputStream 的原理。

InputStream OutputStream 和他们的缓冲器。 都相当于一条管道。 Buffer 相当于一个水池,或者说一个大的水管。

当 br.readLine(); 的时候 管道会向来源方 抽水(索取一行字符串) 会一直等到有水来了为止。(阻塞,一直等待) 而管道那头连接的是 用户输入(System.in)

所以当你调用 br.readLine(); 的时候。 就相当于会向管道的那头System.in 索取一行数据。

只要没进行 br.close() 之前,这个管道是建立 相通的。

所以 正确上来说。 程序不是 跳到第一个 System.in 那行。 而是 从没关闭的通道 里 获取System.in的用户输入。

希望我的回答,能让你明白。有任何问题请追问。 我的回答如果对你有帮助的话,请采纳。
waitfor00
2015-10-13 · 超过10用户采纳过TA的回答
知道答主
回答量:31
采纳率:100%
帮助的人:11.8万
展开全部
java se5以后提供了一个比较好的输入方法
下面是一个小例子:
import java.util.*;
class test{
public static void main(String []args){
Scanner cin=new Scanner(System.in);
System.out.println("请输入你的名字:");
String name=cin.nextLine();
System.out.println("你输入你的年龄");
int age=cin.nextInt();
System.out.println("你的名字是:"+name+" "+"你的年龄是:"+age);}
}

就像上面一样,如果想输入double则用,nestDouble等
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jongyping
2012-05-19 · 超过31用户采纳过TA的回答
知道答主
回答量:79
采纳率:0%
帮助的人:69.8万
展开全部
语句在执行的时候都是执行等号右边,将返回值赋给左边的变量,在readLine()这里,看似只有一句,其实在方法体里有好多句,这里就阻塞在了等待结束符的地方,只有当你输入结束符(注:readLine()的结束符就是回车),这句才会有返回值,程序才会继续往下走,这句运行之后s指向你新输入的字符串,不可能为空的,即便直接敲回车s="",这也不是null,这是字符串,只是长度为0而已!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幽冥神者
2012-05-18 · TA获得超过3213个赞
知道大有可为答主
回答量:1953
采纳率:50%
帮助的人:1792万
展开全部
s = br.readLine();
while(s!=null){
if(s.equalsIgnoreCase("exit")) break;
System.out.println(s.toUpperCase());
s = br.readLine();
}
这个循环基本上是个死循环,这里的s不可能为null
s = br.readLine() 这里的s,每次执行完都指向一个新的字符串。但执行到这里的时候会阻塞,阻塞期间s的值还是上一次循环时的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式