Java 基础——Scanner 类

这篇具有很好参考价值的文章主要介绍了Java 基础——Scanner 类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

(1)Scanner 类是 Java 中一个用于读取用户输入的工具类。它可以从多种输入源读取数据,例如标准输入流、文件或字符串。Scanner 类提供了一系列方法来处理不同数据类型的输入,比如整数、浮点数、布尔值、字符和字符串等。

(2)Scanner 类中有两种比较重要的方法:

  • hasNext 开头的方法:用于检查输入源中是否还有下一个标记可用,常用的有:
    • hasNext():如果输入源中还有下一个标记(非空格字符),返回 true。
    • hasNextLine():如果输入源中还有下一行(非空行),返回 true。
    • hasNextInt():如果输入源中还有下一个整数,返回 true。
    • hasNextDouble():如果输入源中还有下一个浮点数,返回 true。
    • hasNextBoolean():如果输入源中还有下一个布尔值,返回 true。
  • next 开头的方法:用于从输入源中获取下一个标记并返回相应的数据类型,常用的有:
    • next():从输入源中获取并返回一个字符串,默认以空格为分隔符,以回车 Enter 为结束符,回车 Enter 后的内容则放入缓冲区。
    • nextLine():从输入源中获取并返回一行字符串(以换行符为分隔符)。
    • nextInt():从输入源中获取并返回一个整数。
    • nextDouble():从输入源中获取并返回一个浮点数。
    • nextBoolean():从输入源中获取并返回一个布尔值(“true” 或 “false”)。

(3)next()nextLine() 在处理方式和使用场景方面有一些区别:

  • next() 方法:
    • 读取的字符串不包含分隔符,如果输入中存在多个以空格分隔的单词,next() 方法只会返回第一个单词
    • 在读取之前会忽略输入中的前导空格
  • nextLine() 方法:
    • 从输入源中读取并返回一整行字符串,包括换行符 \n 在内。
    • 它会读取输入源中的全部内容直到遇到换行符,或者输入结束。
    • nextLine() 方法返回的字符串可以包含空格和其他特殊字符。

2.使用举例

2.1.从不同的输入源读取数据

当使用 Scanner 类时,可以从不同的输入源读取数据,包括标准输入流、文件和字符串等。下面是几个使用不同输入源的示例:

(1)从标准输入流读取数据

public class Example {
    public static void main(String[] args) {
        // 创建 Scanner 对象,使用标准输入流作为输入源
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个整数:");
        int number = scanner.nextInt(); // 从标准输入流读取整数

        System.out.println("你输入的整数是:" + number);

        scanner.close();
    }
}

在这个示例中,我们创建了一个 Scanner 对象,并将标准输入流(System.in)作为输入源。然后我们使用 nextInt() 方法从标准输入流读取一个整数。

(2)从文件读取数据

public class Example {
    public static void main(String[] args) {
        try {
            // 创建 Scanner 对象,使用文件作为输入源
            Scanner scanner = new Scanner(new File("input.txt"));

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine(); // 从文件读取一行数据
                System.out.println(line);
            }

            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们创建了一个 Scanner 对象,并将文件 “input.txt” 作为输入源。然后我们使用 hasNextLine()nextLine() 方法循环读取文件的每一行数据并打印出来。

(3)从字符串读取数据

public class Example {
    public static void main(String[] args) {
        String input = "Hello World 123";
        // 创建 Scanner 对象,使用字符串作为输入源
        Scanner scanner = new Scanner(input);
        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                int number = scanner.nextInt(); // 从字符串读取整数
                System.out.println("整数:" + number);
            } else {
                String word = scanner.next(); // 从字符串读取单词
                System.out.println("单词:" + word);
            }
        }
        scanner.close();
    }
}

在这个示例中,我们创建了一个 Scanner 对象,并将字符串 “Hello World 123” 作为输入源。然后我们使用 hasNext()hasNextInt()next() 方法循环读取字符串中的每个单词或整数,并打印出来。

2.2.next() 和 nextLine() 的区别

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

        // next() && nextLine()
        System.out.println("请输入一个字符串 nextLine():");
        String str1 = scanner.nextLine();
        System.out.println(str1);

        System.out.println("请输入一个字符串 next():");
        String str2 = scanner.next();
        System.out.println(str2);
    }
}

结果如下:

请输入一个字符串 nextLine():
   Hello World  
nextLine() 的读取结果为: 
   Hello World  

请输入一个字符串 next():
   Hello   World
next() 的读取结果为: 
Hello

2.3.读取大小已知的一维数组

描述:第一行输入是以一个整数 n,表示数组 nums 的长度,第 2 行输入 n 个整数,整数之间用空格分隔。请将这些整数保存到数组 nums 中,然后将其打印出来。例如:

7
4 9 0 -1 6 8 9

(1)使用 nextInt() 逐个读取:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //数组的长度
        int n = scanner.nextInt();
        int[] nums = new int[n];
        //数组中的 n 个数
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }
        System.out.println("数组 nums 的元素为:");
        for (int num : nums) {
            System.out.print(num + " ");
        }
        scanner.close();
    }
}

结果如下:

7
4 9 0 -1 6 8 9
数组 nums 的元素为:
4 9 0 -1 6 8 9 

(2)使用 nextLine() 先全部读取,然后逐个解读:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //清除缓冲区中的换行符
        scanner.nextLine();
        int[] nums = new int[n];
        String input = scanner.nextLine();
        //以一个或者多个空格为分隔符
        String[] numStrings = input.split("\\s+");
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(numStrings[i]);
        }
        System.out.println("数组 nums 的元素为:");
        for (int num : nums) {
            System.out.print(num + " ");
        }
        scanner.close();
    }
}

注意事项:

  • 需要注意的是在使用 nextInt() 方法读取整数后,缓冲区仍然会包含一个换行符 \n。这是因为 nextInt() 只读取了整数部分,而没有读取换行符。当接下来调用 nextLine() 方法时,它会读取缓冲区中的剩余部分,即仅包含换行符的部分。因此,为了确保 nextLine() 方法可以读取到用户输入的整行字符串,我们需要在调用 nextLine() 方法之前清除缓冲区中的换行符。
  • 通过调用 scanner.nextLine() 但不将其结果保存到变量中,实际上是表示我们只想要从缓冲区中读取并丢弃这个换行符。这样,接下来调用 nextLine() 方法时,它将读取到用户输入行的内容,并将其保存到字符串 input 中,而不会被之前的换行符干扰。确保清除缓冲区中的换行符是一种常见的做法,以避免由于换行符残留而导致不正确的输入或跳过输入的情况发生。
  • 如果在上面代码中没有 scanner.nextLine() 这行语句的话,那么会出现如下错误:
7
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:592)
	at java.lang.Integer.parseInt(Integer.java:615)
	at Solution.main(Solution.java:15)

2.4.读取大小未知的一维数组

描述:输入若干个整数,整数之间用空格分隔。请将这些整数保存到数组 nums 中,然后将其打印出来。例如:

1 12 3 4 5 6 

(1)使用 nextInt() 逐个读取:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Integer> nums = new ArrayList<>();
        while (scanner.hasNextInt()) {
            nums.add(scanner.nextInt());
        }
        System.out.println("数组 nums 的元素为:");
        for (int num : nums) {
            System.out.print(num + " ");
        }
        scanner.close();
    }
}

注意事项:

  • 如果在控制台手动输入若干个整数,期望手动停止输入后,程序结束读取整数,可以使用其他方式来指示结束输入的条件。一种常见的方式是通过输入特定的字符或字符串来表示结束;
  • 由于是逐个读取,因此事先不知道数组的长度,所以上面代码中使用 list 来存储;

(2)使用 nextLine() 先全部读取,然后逐个解读:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        input = input.trim();
        String[] numStrings = input.split("\\s+");
        int[] nums = new int[numStrings.length];
        for (int i = 0; i < numStrings.length; i++) {
            nums[i] = Integer.parseInt(numStrings[i]);
        }
        System.out.println("\n数组 nums 的元素为:");
        for (int num : nums) {
            System.out.print(num + " ");
        }
        scanner.close();
    }
}

结果如下:

1 12 3 4 5 6 

数组 nums 的元素为:
1 12 3 4 5 6 

2.5.读取长度大小已知的二维数组

描述:第一行输入是两个整数 m 和 n,中间用空格分隔,后面跟随 m 行,每行都有 n 个整数,整数之间用空格分隔。例如:

3 4
1 8 7 3
2 3 4 5
4 5 6 7

(1)使用 next() 读取:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取整数 m 作为二维数组的长度
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.nextLine(); // 读取换行符
        //创建二维数组 nums
        int[][] nums = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                nums[i][j] = scanner.nextInt();
            }
        }
        //打印二维数组 nums
        System.out.println("\n数组 nums 的元素为:");
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                System.out.print(nums[i][j] + " ");
            }
            System.out.println();
        }
    }
}

(2)使用 nextLine() 读取:

class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取整数 m 作为二维数组的长度
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.nextLine(); // 读取换行符
        //创建二维数组 nums
        int[][] nums = new int[m][n];
        //读取 m 行数据到二维数组 nums
        for (int i = 0; i < m; i++) {
            //读取整行数据
            String line = scanner.nextLine();
            //将每个整数分割保存到一维数组
            String[] values = line.split("\\s+");
            //创建长度为 n 的一维数组
            nums[i] = new int[n];
            //保存每个整数到一维数组
            for (int j = 0; j < n; j++) {
                nums[i][j] = Integer.parseInt(values[j]);
            }
        }
        //打印二维数组 nums
        System.out.println("\n数组 nums 的元素为:");
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                System.out.print(nums[i][j] + " ");
            }
            System.out.println();
        }
    }
}

结果如下:

3 4
1 8 7 3
2 3 4 5
4 5 6 7

数组 nums 的元素为:
1 8 7 3 
2 3 4 5 
4 5 6 7 

2.6.读取长度大小未知的二维锯齿数组

描述:输入若干行,每一行有若干个整数,整数之间用空格分隔,并且每一行的整数个数不一定相同。例如:

1 2 3 45 
3 4 
9 0 -1 2 
1 4 6 
4 6 7 8 7 
class Solution {
    public static void main(String[] args) {          
        Scanner scanner = new Scanner(System.in);
        List<List<Integer>> nums = new ArrayList<>();
        // 逐行读取数据并保存到二维数组锯齿 nums
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.isEmpty()) {
                break; // 输入结束
            }
            String[] values = line.split("\\s+");
            List<Integer> row = new ArrayList<>();
            for (String value : values) {
                row.add(Integer.parseInt(value));
            }
            nums.add(row);
        }
        //打印二维锯齿数组 nums
        System.out.println("二维锯齿数组 nums 的元素为:");
        for (List<Integer> row : nums) {
            for (Integer value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

结果如下:文章来源地址https://www.toymoban.com/news/detail-699202.html

1 2 3 45
3 4
9 0 -1 2
1 4 6
4 6 7 8 7

二维锯齿数组 nums 的元素为:
1 2 3 45 
3 4 
9 0 -1 2 
1 4 6 
4 6 7 8 7 

到了这里,关于Java 基础——Scanner 类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中Scanner用法

    Scanner 可以实现程序和人的交互,用户可以利用键盘进行输入。 不同类型的输入: 例如:从键盘输入hello world。 上述之所以只会输出“hello”,是因为 这种输入遇到空格、制表符、回车就停止接受, 因此,就不会接受“hello”后面的数据了。我们要想接受完整的“hello world”

    2024年02月07日
    浏览(45)
  • Java学习 用户交互 Scanner

    Scanner 是Java5提供的新特性 可以用来获取用户的输入 需要引入import java.util.Scanner;类 基础语法: Scanner scanner = new Scanner(System.in); 可以通过Scanner类的next()和nextLine()来获取输入的字符串一般在输入前使用 hasnext()和 hasNextLine()用来判断是否有输入的数据 next()与nextLine()区别: ①

    2024年03月17日
    浏览(76)
  • java中Scanner的简单用法

    一.用法 1.先导入Java.util.Scanner包 2.创建Scanner类的对象 3.创建一个变量来接收数据 二.输入不同类型数据 1.输入字符串 Java中next()只能获取空格之前的数据 例如: 效果: 为了获得所以数据,我们修改输入数据的分隔符,添加sc.useDelimiter(\\\"n\\\");   效果:    2.输入整数,浮点数

    2024年02月07日
    浏览(54)
  • Java Math类与Scanner类

    一、Math类         1.构造方法            Math类没有构造方法,不需要对象就可以访问Math类中的变量和方法;Math类中的变量和方法都是static修饰。         2.常用方法 static double E 自然对数的基数 static double PI 圆周长与其直径的比率 static double max(double a, double b) 返回两个

    2024年02月11日
    浏览(37)
  • java常用工具之Scanner类

    Java 的 Scanner 类是一个方便在控制台扫描用户输入的工具类,虽然它也可以扫描文件内容,但我们通常更喜欢它扮演前面的角色,因为扫描文件可以通过文件流来完成。 接下来,我们通过几个简单的示例讲一下 Scanner 类。 通常,我们会使用 Scanner 类来扫描控制台输入,尤其是

    2024年02月05日
    浏览(51)
  • Java Scanner 类,超详细整理,适合新手入门

    目录 一、什么是 Java Scanner 类? 二、引用数据类型 1、引用数据类型的定义 三、Scanner 类有哪些常用方法? hasNext()用法 四、next() 与 nextLine() 区别 next(): nextLine(): 五、使用 next 方法 五、使用 nextLine方法 Java Scanner 类是 Java 中一个用于读取用户输入的类,它可以从标准输入、

    2024年02月06日
    浏览(56)
  • IDEA中单元测试使用Scanner控制台无法输入

    今天使用IDEA,Junit使用Scanner控制台无法输入,我以为是代码的问题。于是把单元测试换成了main函数,发现控制台可以输入。那么如何解决这个问题呢? 目录 idea控制台不能输入 解决 IDEA控制台中不能输入数据 idea控制台不能输入 下面是一个简单的测试代码: 在该单元测试运

    2024年04月26日
    浏览(44)
  • Java零基础入门-输入与输出

    哈喽,各位小伙伴们,你们好呀,我是喵手。   今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。   我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,

    2024年02月05日
    浏览(39)
  • sonar-scanner-Windows本地Python代码检查使用方法【免费下载sonar-scanner验证有效】

    背景介绍: sonar作为开源的代码扫描工具,sonar-scanner是windows扫描器。SonarQube是一个开源的代码质量管理平台,可以将 sonar-scanner扫描的结果进行分析。 公司有搭建SonarQube质量管理平台,支持本地扫描和gitlab集成扫描。现在需要将本地的代码进行扫描,于是尝试了Windows本地

    2024年02月09日
    浏览(232)
  • 3D scanner with DLPC3478

    https://www.bilibili.com/video/BV1vJ411J7ih?p=3vd_source=109fb20ee1f39e5212cd7a443a0286c5 因数: 分别率 波长 pattern速度 DMD 与 DLPC匹配 3D scanner是结构光的概念走的 Internal pattern, 是DLPC内部提供图像给DMD External Pattern, 外部FPGA /MCU send pattern to DLPC (Parallel I/F 28), 然后DLPC传输图像到DMD。 外部图案信号

    2024年01月22日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包