【问题标题】:How to use System.in.read() properly如何正确使用 System.in.read()
【发布时间】:2021-10-12 09:26:46
【问题描述】:

我尝试使用 System.in.read() 来获取用户的年龄。我的问题是,如果我写“24”,它会给我输出“你 50 岁”。我搜索了一下,发现它与编码有关。所以 24 映射到 50。

有人建议将整数转换为字符。所以它应该工作。但这次我输入 24 时,我得到的答案是“你 2 岁”。

我想要的是,我得到“你 24 岁”的答案。我该怎么做?

我的代码如下: 第一次尝试

public static void main(String[] args) throws IOException {
    System.out.println("Hallo " + args[0]);
    System.out.println("Wie alt bist du?");
    int alter = System.in.read();
    System.out.println("Du bist " + alter + " Jahre alt.");
}

输出:“你已经 50 岁了。”

第二次尝试:

public static void main(String[] args) throws IOException {
    System.out.println("Hallo " + args[0]);
    System.out.println("Wie alt bist du?");
    char alter = (char) System.in.read();
    System.out.println("Du bist " + alter + " Jahre alt.");
}

输出:“你 2 岁。”

小注:“Alter”在德语中表示年龄。

我希望有人可以帮助我并理解这个问题。如果我可以改进一些东西,请告诉我。将不胜感激。

【问题讨论】:

  • 是否必须使用System.in.read()?因为在我看来还有其他更好、更容易获得用户输入的方法,比如使用扫描仪。
  • 不,但我想用 'System.in.read()' 试试。只是出于好奇。
  • 我同意@OHGODSPIDERS 的观点,认为有更好的方法,我只是不认为Scanner 是其中之一 ;-) System.in.read 读取单字节数据,因为System.inInputStreamInputStream 用于读取二进制数据(或者如果您不关心数据是什么,而只想将其从一个地方移动到另一个地方)。要阅读文本(例如用户输入的内容),您应该使用 Reader
  • 字符“2”的 ASCII 或 Unicode 值为 50。您正在寻找字符串中的行输入。我建议尝试Console,而不是更频繁地将 System.in 包装在 Scanneer 中的解决方案。请注意,您可能必须在命令行中运行应用程序,而不是 IDE。
  • 啊。现在我看到了问题。当我输入 24 时,它只读取 2 而不是整数。所以这个方法不是为了做我想做的。

标签: java encoding integer character system.in


【解决方案1】:

System.in.read() 只读取一个字节——这不是你想要的——至少在真正使用它时不会。

发生的情况是,您输入24 - 输入的2 被解释为字节并且您得到它的ASCII 值。 2 的 ASCII 十六进制值为 0x32,十进制为 50。

见:https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

您可以读取多个单字节并通过计算将它们转换为您想要的整数值。

更好的方法是像这样使用Scanner

      import java.util.Scanner;
      [...]
      Scanner scanner = new Scanner( System.in );
      System.out.print( "enter your age: " );
      
      try {
        int age = scanner.nextInt();
        System.out.print("Entered age is : "+ age);
      } catch(InputMismatchException e) {
        System.out.print("Invalid age entered.");
      }
      [...]

您需要处理诸如输入年龄不应为负整数或否等条件。例如200,如果您的要求需要。为此,您可以编写if 条件来验证age 值。

【讨论】:

    【解决方案2】:

    这是使其工作的一种方法,但您应该使用 ConsoleScanner

        public static void main(String[] args) {
            try {
                System.out.println("Hallo " + args[0]);
                System.out.println("Wie alt bist du?");
                String accumulator = "";
                do {
                    char alter = (char) System.in.read();
                    accumulator += alter;
                }
                while (System.in.available() > 0); 
                System.out.println("Du bist " + accumulator.trim() + " Jahre alt.");
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    

    注意:以上不是推荐的解决方案,只是一个说明

    【讨论】:

      【解决方案3】:

      控制台示例,允许从密码和提示输入。 它还使用带有占位符的格式。

      Console con = System.console(); // null when there is no console like in the IDE.
      
      con.printf("Hallo %s%n", args[0]);
      
      String answer = con.readLine("Wie alt bist du, %s? ", args[0]);
      int alter = answer.matches("\\d+") ? Integer.parseInt(answer) : 13;
      con.printf("Du bist %d Jahre alt.%n", alter);
      

      请注意,您需要一个真正的命令行,否则con 将为空。

      另一个缺点是转换(Integer.parseInt)必须自己完成。

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2014-05-03
        • 1970-01-01
        • 2012-10-18
        • 2020-12-04
        • 2012-07-12
        • 2013-01-21
        • 2021-10-24
        相关资源
        最近更新 更多