0

以下面的基本程序为例:

import java.util.Scanner;

public class Practice 
{
    public static void main(String[] args)  
    {
        char userInput;
        String convertString;

        do 
        {
            System.out.println("Here are your choices:");
            System.out.println("A. \nB. \nC. \nD.");

            Scanner kbd = new Scanner(System.in);
            convertString = kbd.next();
            userInput = convertString.charAt(0);

            switch(userInput)
            {
            case 'A':
                System.out.println("You have chosen A!");
                break;
            case 'B':
                System.out.println("You have chosen B!");
                break;
            case 'C':
                System.out.println("You have chosen C!");
                break;
            case 'D':
                System.out.println("You have chosen D! This program will now terminate.");
                break;
            default:
                System.out.println("Sorry, you have to make a selection.");
            }
        } while (userInput > 'D');

    }
}

它工作得很好。但是,如果我不使用Scanner版本,而是使用System.in.read()版本,我的程序将在允许我进行选择之前循环 3 次。为什么会发生这种情况,我该如何解决?

由于我来自 C/C++ 背景,我假设这是因为输入流中有字符\n 'left over',并且当程序循环而不允许我输入所需的输入时,它正在“清除”流. 但如果这是真的,为什么它会循环 3 次而不是一次(因为要清除\n您只需要从输入流中获取另一个剩余字符)?

最后,哪种方法最好/更常用?

谢谢!

4

2 回答 2

0

使用时程序会循环三次,System.in.read()因为在 Windows 上,行分隔符是两个字符:回车后跟换行符,或"\r\n".

在 Unix 系统(Mac OS X、Linux、Solaris 等)上,行分隔符是一个换行符\n

System.in您可以通过包装并阅读整行来克服这个问题BufferedReader,或者更好的是,使用ScannerorConsole类,或者根据某些人的说法,最好使用图形用户界面。

使用旧方法的示例:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line = in.readLine();

Console使用该类的示例:

Console con = System.console();
String line = con.readLine();
于 2013-09-26T20:58:09.567 回答
0

System.in是一个InputStream,它是一个非常低级的流类,类似于std::streambufC++ 或 Cfread中的 。它允许您读取单个字节和固定大小的字节数组。要用它做一些有用的事情,你应该把它包装在一个BufferedReader提供readLine()方法的 中。

于 2013-09-26T20:59:00.553 回答