比util.Scanner更好的选项,可以获取和返回JAVA中的用户输入

时间:2018-09-24 17:37:40

标签: java java.util.scanner bufferedreader

因此,由于这里有一些反馈,我花了一些时间研究util.Scanner。在How to use java.util.Scanner to correctly...

上的这篇文章中找到了最令我印象深刻的声明
  

您可能永远不会真正看到Scanner在专业/商业业务应用程序中使用,因为它所做的一切都可以通过其他方式更好地完成。现实世界中的软件必须比Scanner允许您编写代码更具弹性和可维护性。现实世界的软件使用标准化的文件格式解析器和文档化的文件格式,而不是单独分配给您的即席输入格式。

因此,我查找了一些其他选项来获取用户输入,并决定使用BufferedReader。我要完成的工作是让用户告诉程序他们是否要继续玩游戏,让程序重复问题直到给出有效输入(Y / N),并让程序执行根据答案继续或终止。

三个相关问题:

BufferedReader比Scanner更好吗?

是否有一个更好地解决此任务的选项?是的,那是什么?

如果答案不符合标准,让方法本身调用以创建“循环”是否合适?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class RageGame {

public static void main(String[] args) throws IOException  {

    char playAgain = 'Y';

    // Loop game until user decides they are done.
    do { 
        playAgain = playRage();

    } while (playAgain == 'Y');

    //Quit message      
    System.out.println("Thanks for playing Rage!");

}

public static char playRage() throws IOException {

    return playAgain();
}
public static char playAgain() throws IOException{
    char answer;

    BufferedReader kb = new BufferedReader(new InputStreamReader(System.in));

    //Ask the user if they want to continue and set their response to upper case.
    System.out.println("Do you wish to play again? (y/n)");
    answer = (char) Character.toUpperCase(kb.read());

    //Check if answer fits criteria
        if (answer != 'Y' && answer != 'N') {
            System.out.println("Sorry, " + answer + " is not a valid answer.");
            return playAgain();

        }else {
        return answer;


        }
    }
}

2 个答案:

答案 0 :(得分:1)

简短的回答是:不要关闭它。

您的Scanner正在使用流System.inSystem.in不是您的程序获取的资源(您没有打开流),因此不应关闭它。其他人负责关闭该程序。

如果发现警告令人讨厌,则可以将其静音。

让我们假设您的扫描仪从文件而不是System.in接收输入,那么您需要在上一次需要使用后调用close

answer = Character.toUpperCase(kb.next().charAt(0)); 
kb.close();

如果您担心忘记调用close,只需使用try-with-resources块,它将为您关闭!

try (Scanner kb = new Scanner(some other source)) {
    System.out.println("Do you wish to play again? (y/n)");
    answer = Character.toUpperCase(kb.next().charAt(0)); 
} // this will always close the scanner

答案 1 :(得分:-1)

另外,如果您想关闭扫描仪,则可以将System.in包装在CloseShieldInputStream内。您的扫描仪将使用代理流。如果您有兴趣,请看看http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html