Java中的 Scanner简述(企业笔试在线编程的输入控制)

摘要:

  最近进行企业在线笔试时,发现企业的笔试平台大都使用赛码网(虽然槽点很多),而且在线编程都需要使用Scanner来读取程序的输入,因此,笔者就在先辈们的成果上对Scanner做了一份全新的、详细的总结。我们知道,java.util.Scanner是Java5的新特征,主要功能是简化文本扫描。这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地,特此简述。



版权声明:

本文原创作者:书呆子Rico

作者博客地址:http://blog.csdn.net/justloveyou_/


一. 扫描控制台输入

  这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了。在这个例子中,通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。

/**
* 扫描控制台输入
*
*/
public class TestScanner {
        public static void main(String[] args) {
                Scanner s = new Scanner(System.in);
                System.out.println("请输入字符串:");
                while (true) {
                        String line = s.nextLine();
                        if (line.equals("exit")) break;
                        System.out.println(">>>" + line);
                }
        }
}/* Output():
        请输入字符串:
        234
        >>>234
        wer
        >>>wer
        bye
        >>>bye
 *///

二. Scanner的便捷性

  如果说Scanner使用简便,不如说Scanner的构造器支持多种方式,构建Scanner的对象很方便。我们可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以 逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做特定的处理。


三. Scanner分隔符

  Scanner 默认使用空格作为分隔符来分隔文本,但允许我们通过使用方法useDelimiter(String pattern)指定新的分隔符特别需要注意的是,方法useDelimiter(String pattern)的参数是一个正则表达式字符串,若想指定多个分隔符来分割,须使用”|”将它们隔开。如下所示:

public static void test7() {
    Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf    ......asdfkl    las");
    s.useDelimiter(" |,|\\.");    // 将使用空格,逗号和点号来分割Scanner输入
    while (s.hasNext()) {
        System.out.println(s.next());
    }
}/* Output():
        123
        asdf
        sd
        45
        789
        sdf
        asdfl
        sdf
        sdfl
        asdf

        asdfkl

        las
 *///

四、Scanner常用API剖析和使用实例

  现列举Java中关于Scanner比较常用的几个API:

  • delimiter()

      返回此 Scanner 当前正在用于匹配分隔符的 Pattern。

  • hasNext()

      判断扫描器中当前扫描位置后是否还存在下一段,默认以一个或多个连续的空格作为段的分隔符。

  • hasNextLine()

      如果在此扫描器的输入中存在另一行(以回车作为”分行符”),则返回 true。

  • next()

      查找并返回来自此扫描器的下一个完整标记(取得输入段)。

  • nextLine()

      此扫描器执行当前行,并返回跳过的输入信息(取得输入行文本)。



Scanner使用实例 (主要针对笔试编程中的多行输入和单行输入)

1). hasNextLine() 和 nextLine() 的用法

public class TestScanner1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 正则表达式字符串
        //scanner.useDelimiter("\\*");

        System.out.println("请输入字符串:");

        // test1(scanner);
         test2(scanner);
        // test3(scanner);
    }

    /**
     * @description 以行(回车)读取,每在控制台输入三行则打印一次;不够三行,则阻塞等待
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test1(Scanner scanner) {
        while (true) {      // scanner 不断从控制台读取,若无内容,则阻塞等待

            // 以行读取
            String s1 = scanner.nextLine();
            String s2 = scanner.nextLine();
            String s3 = scanner.nextLine();

            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }

    /**
     * @description 以行(回车)读取,每在控制台输入三行则打印一次;不够三行,则阻塞等待(与方法test1等效)
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test2(Scanner scanner) {
        while (scanner.hasNextLine()) {        // 一旦控制台有输入,scanner就开始从控制台读取

            // 以行读取
            String s1 = scanner.nextLine();
            String s2 = scanner.nextLine();
            String s3 = scanner.nextLine();

            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }

    /**
     * @description 以行读取,每敲一次回车键读取一次,不会忽略空格
     * @author rico
     * @created 2017年4月5日 上午10:31:14
     * @param scanner
     */
    public static void test3(Scanner scanner) {
        while (scanner.hasNextLine()) {  // 一旦控制台有输入,scanner就开始从控制台读取
            String s1 = scanner.nextLine();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s1.length());
        }
    }

             



2). hasNext() 和 next() 的用法

public class TestScanner1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 正则表达式字符串
        //scanner.useDelimiter("\\*");

        System.out.println("请输入字符串:");

        // test4(scanner);
        test5(scanner);
        //test6(scanner);
    }

    /**
     * @description 默认以一个或多个空格作为分割符来分隔行文本,每三个作为一组输出一次(不够三个则阻塞等待,直到够三个才作为一组进行输出);此外,连续输入三行(每行一个)也可以。
     * @author rico
     * @created 2017年4月5日 上午10:37:54
     * @param scanner
     */
    public static void test4(Scanner scanner) {
        while (true) {   // scanner 不断从控制台读取,若无内容,则阻塞等待
            String s1 = scanner.next();
            String s2 = scanner.next();
            String s3 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }

    /**
     * @description 以一个或多个空格作为分割符来分隔行文本,每三个作为一组输出一次(不够三个则阻塞等待,直到够三个才作为一组进行输出);此外,连续输入三行(每行一个)也可以。
     * @author rico
     * @created 2017年4月5日 上午10:49:22
     * @param scanner
     */
    public static void test5(Scanner scanner) {
        while (scanner.hasNext()) {    // 一旦控制台有输入,scanner就开始从控制台读取
            String s1 = scanner.next();
            String s2 = scanner.next();
            String s3 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s2);
            System.out.println(">>>" + s3);
        }
    }

    /**
     * @description 以一个或多个空格作为分割符来分隔行文本,以一个作为一组进行输出(所有的空格均为分割符),有几个就输出几个
     * @author rico
     * @created 2017年4月5日 上午10:37:54
     * @param scanner
     */
    public static void test6(Scanner scanner) {
        System.out.println(scanner.delimiter());
        while (true) {     // scanner 不断从控制台读取,若无内容,则阻塞等待
            String s1 = scanner.next();
            System.out.println(">>>" + s1);
            System.out.println(">>>" + s1.length());
        }
    }

             



3). nextLine() 与 next() 的区别

  • nextLine():以回车作为换行标志;
  • next() :以一个或多个空格作为分段标志,也可以以回车作为分段标志(如上图所示)。

五. Scanner 扫描文件输入

  看下面例子完成了使用Scanner 扫描文件输入:

 public static void main(String[] args) throws FileNotFoundException {
    InputStream in = new FileInputStream(new File("C:\\AutoSubmit.java")); // 创建文件输入流
    Scanner s = new Scanner(in);
    while(s.hasNextLine()){
        System.out.println(s.nextLine());
    }
}/* Output():
        package own; 

        import java.io.BufferedReader;
        import java.io.BufferedWriter;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.io.OutputStreamWriter;
        import java.net.HttpURLConnection;
        import java.net.ProtocolException;
        import java.net.URL; 

        import com.verisign.uuid.UUID; 

        /**
        * @author wangpeng
        *
        */
        ...
 *///

引用:

java 中的Scanner(非常详细不看后悔)

时间: 2024-10-09 13:42:25

Java中的 Scanner简述(企业笔试在线编程的输入控制)的相关文章

java 中的Scanner

java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地. 一.扫描控制台输入 这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了. 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象.如果要获取输入的内容,则只需要调用S

Java中的Scanner类学习

转载自: Java中Scanner的nextInt(),next(),nextLine()方法总结 今天在java上机课时遇到了个小问题,使用Scanner输入数据时,使用了一次nextInt(),一次nextLine(),却只接收了一个整数.代码如下 code1: 1 package cn.dx; 2 3 import java.util.Scanner; 4 5 public class ScannerTest { 6 7 public static void main(String[] a

Java中基于UDP协议的的网络编程(基础篇)

---恢复内容开始--- 一:什么是网络编程? 通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输.Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习. 二:java网络编程所使用的协议? 有了计算机网络的基础,我们不难理解,在java中,网络编程是基于网络传输协议的. java网络编程,可以是基于TCP协议的,也可以基于UDP协议的.那么首先我们得知道tcp协议和udp两种协议的区别. 区别:

Java中的基于Tcp协议的网络编程

一:网络通信的三要素? IP地址     端口号     通信协议 IP地址:是网络中设备的通信地址.由于IP地址不易记忆,故可以使用主机名.本地环回地址,127.0.0.1   本地主机名localhost 端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数 字称为端口号.端口号是不同进程之间的标识.一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口. 通信协议:指定义的通信规则,这个规则

Java中的Scanner类

java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入.创建Scanner对象的基本语法: Scanner s = new Scanner(System.in); 在读取前,一遍需要hasNext和hasNextLine判断是否还有输入的数据.它们的区别为: next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符.

Java中的Scanner类和String类

1:Scanner的使用(了解)    (1)在JDK5以后出现的用于键盘录入数据的类. (2)构造方法: A:讲解了System.in这个东西.            它其实是标准的输入流,对应于键盘录入        B:构造方法            InputStream is = System.in; Scanner(InputStream is)        C:常用的格式            Scanner sc = new Scanner(System.in);    (3)

java中接口中成员的定义

java中的接口的作用是提供编程框架,它作为统一的规范让其他类进行扩展,是java中非常优秀的设计. 这娃用以下代码总结了java中接口可以定义的成员以及它们默认被修饰的关键字: //外部接口的访问修饰符只能是public或默认修饰符 ,并且它的成员只能用public访问修饰符修饰, 接口不能用final修饰 public interface A { //成员变量,默认用public static final 修饰 String name="ahei"; //成员方法,默认用publi

Java中的包

以下内容引用自http://wiki.jikexueyuan.com/project/java/packages.html: 在Java中使用包是为了防止命名冲突,来控制访问,使得搜索/定位和类.接口.枚举和注释等的使用更为简单. 包可以被定义为一组相关的类型(类.接口.枚举和注释),提供访问保护和命名空间管理. 在Java中一些已经存在的包有: java.lang - 包含了基本类 java.io - 包含有输入,输出功能的类 程序员可以定义自己的包来包含各种类和接口等.把实现的相关类组织在一

java中String、StringBuffer、StringBuilder的区别

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在Abstra