JavaRush /Java 博客 /Random-ZH /Java 中的扫描器类

Java 中的扫描器类

已在 Random-ZH 群组中发布
你好!今天我们的课很特别!在此之前,当解决问题和编写程序时,算法很简单:我们编写一些代码,运行main()方法,程序执行所需的操作,然后退出。但现在一切都将改变!今天我们将学习如何真正与程序交互:我们将教它响应我们的行为!您可能已经明白我们要做什么了。本次讲座我们将详细分析 Java 语言类之一——Scanner。如果您需要读取用户输入的数据,此类将很有用。在我们继续学习代码之前,请告诉我,您曾经遇到过扫描仪这样的设备吗?当然是的。扫描仪的内部结构相当复杂,但其工作的本质却相当简单:它读取用户输入的数据(例如护照或保险单)并将读取的信息存储在内存中(例如,以图像的形式)。所以,今天您将创建自己的扫描仪!当然,他不能处理文档,但他可以很好地处理文本信息:) 走吧!扫描仪类别 - 1

Java 扫描器类

我们需要熟悉的第一个也是最重要的事情就是类java.util.Scanner。它的功能非常简单。就像真正的扫描仪一样,它从您为其指定的源读取数据。例如,从一行、从文件、从控制台。然后它会识别该信息并根据需要进行处理。我们举个最简单的例子:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
我们创建了一个扫描仪对象并为其指定了一个数据源(带有文本的字符串)。该方法nextLine()访问数据源(我们的带有绝句的文本),找到尚未读取的下一行(在我们的例子中是第一行)并返回它。之后我们将其输出到控制台: 控制台输出:

Люблю тебя, Peterа творенье,
我们可以多次使用该方法nextLine()并输出整首诗:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
每次我们的扫描仪都会向前一步并读取下一行。程序的结果输出到控制台:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
正如我们已经说过的,扫描仪的数据源不仅可以是字符串,还可以是控制台等。对我们来说重要的消息:如果以前我们只在那里输出数据,现在我们将从键盘输入数据!让我们看看Scanner类还能做什么:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
该方法nextInt()读取并返回输入的数字。在我们的程序中,它用于给变量赋值number。这看起来更像是一个真正的扫描仪!该程序要求用户在一行中输入任意数字。用户完成此操作后,程序会感谢他,在控制台上显示其工作结果并结束。但我们仍然面临一个严重的问题。用户可能会犯错误并输入错误的内容。 这是我们当前的程序何时停止工作的示例:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
让我们尝试输入字符串“JavaRush”而不是数字: 控制台输出:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
糟糕,一切都很糟糕 -_- 为了避免这种情况,我们需要想出一种方法来验证用户输入的数据。例如,用户输入除数字之外的任何内容,最好在控制台中显示一条警告,表明输入的信息不是数字,如果一切正常,则显示确认文本。但要做到这一点,我们实际上需要“展望未来”——找出我们流程中的下一步。Java中的Scanner可以做到这一点吗?他怎么可以!为此,它有一整组方法: hasNextInt()- 该方法检查输入数据的下一部分是否是数字(分别返回 true 或 false)。 hasNextLine()— 检查下一条数据是否是字符串。 hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- 所有这些方法对于其他数据类型都执行相同的操作。让我们尝试改变我们的程序来读取数字:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
现在我们的程序检查输入的下一个字符是否是数字。仅当是时,它才会显示确认信息。如果输入未通过测试,程序会注意到这一点并要求您重试。本质上,您可以与 Scanner 对象进行通信,并提前知道期望的数据类型。“嘿,扫描仪,下一步是什么?数字、字符串还是其他?数字?哪一个—— int、、shortlong” 这种灵活性使您有机会根据用户行为构建程序逻辑。另一个值得关注的重要方法是useDelimiter()。此方法将传递要用作分隔符的字符串。例如,我们突然对日本诗歌产生了兴趣,决定用扫描仪阅读大诗人松尾芭蕉的几首俳句。即使在一行笨拙的行中给出了三段不同的经文,我们也可以轻松地将它们分开并很好地格式化它们:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
我们使用Scanner类的useDelimeter()方法 作为行分隔符:它负责将传入的数据分成几部分。在我们的例子中,单引号( “'” )作为参数传递并用于分隔字符串。此引用后面的文本出现在新行中,因为在 while 循环中我们使用System类的println()方法来读取数据。结果,我们将在控制台中得到漂亮的输出,就像书中一样:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
在同一个例子中,还有一种方法你一定要注意 - close()。与任何使用 I/O 流的对象一样,扫描仪在完成其工作后应关闭,以便它不再消耗我们的计算机资源。 永远不要忘记方法close()
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
就这样!正如您所看到的,Scanner 类非常易于使用并且非常有用!:)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION