菜鸟教程 -- 学的不仅是技术,更是梦想!

Java 教程
(追記) (追記ここまで)

Java Scanner 类

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

下面是创建 Scanner 对象的基本语法:

Scanners = newScanner(System.in);

接下来我们演示一个最简单的数据输入,并通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据:

使用 next 方法:

ScannerDemo.java 文件代码:

importjava.util.Scanner; publicclassScannerDemo{publicstaticvoidmain(String[]args){Scannerscan = newScanner(System.in); // 从键盘接收数据// next方式接收字符串System.out.println("next方式接收:"); // 判断是否还有输入if(scan.hasNext()){Stringstr1 = scan.next(); System.out.println("输入的数据为:" + str1); }scan.close(); }}

执行以上程序输出结果为:

$ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
runoob com
输入的数据为:runoob

可以看到 com 字符串并未输出,接下来我们看 nextLine。

使用 nextLine 方法:

ScannerDemo.java 文件代码:

importjava.util.Scanner; publicclassScannerDemo{publicstaticvoidmain(String[]args){Scannerscan = newScanner(System.in); // 从键盘接收数据// nextLine方式接收字符串System.out.println("nextLine方式接收:"); // 判断是否还有输入if(scan.hasNextLine()){Stringstr2 = scan.nextLine(); System.out.println("输入的数据为:" + str2); }scan.close(); }}

执行以上程序输出结果为:

$ javac ScannerDemo.java
$ java ScannerDemo
nextLine方式接收:
runoob com
输入的数据为:runoob com

可以看到 com 字符串输出。

next() 与 nextLine() 区别

next():

  • 1、一定要读取到有效字符后才可以结束输入。
  • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串。

nextLine():

  • 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  • 2、可以获得空白。

如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

ScannerDemo.java 文件代码:

importjava.util.Scanner; publicclassScannerDemo{publicstaticvoidmain(String[]args){Scannerscan = newScanner(System.in); // 从键盘接收数据inti = 0; floatf = 0.0f; System.out.print("输入整数:"); if(scan.hasNextInt()){// 判断输入的是否是整数i = scan.nextInt(); // 接收整数System.out.println("整数数据:" + i); }else{// 输入错误的信息System.out.println("输入的不是整数!"); }System.out.print("输入小数:"); if(scan.hasNextFloat()){// 判断输入的是否是小数f = scan.nextFloat(); // 接收小数System.out.println("小数数据:" + f); }else{// 输入错误的信息System.out.println("输入的不是小数!"); }scan.close(); }}

执行以上程序输出结果为:

$ javac ScannerDemo.java
$ java ScannerDemo
输入整数:12
整数数据:12
输入小数:1.2
小数数据:1.2

以下实例我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果:

ScannerDemo.java 文件代码:

importjava.util.Scanner; classRunoobTest{publicstaticvoidmain(String[]args){System.out.println("请输入数字:"); Scannerscan = newScanner(System.in); doublesum = 0; intm = 0; while(scan.hasNextDouble()){doublex = scan.nextDouble(); m = m + 1; sum = sum + x; }System.out.println(m + "个数的和为" + sum); System.out.println(m + "个数的平均值是" + (sum / m)); scan.close(); }}

执行以上程序输出结果为(输入非数字来结束输入):

$ javac ScannerDemo.java
$ java ScannerDemo
请输入数字:
12
23
15
21.4
end
4个数的和为71.4
4个数的平均值是17.85

常用方法

方法 描述
构造方法
Scanner(File source) 从文件创建 Scanner
Scanner(InputStream source) 从输入流创建 Scanner
Scanner(String source) 从字符串创建 Scanner
基本输入方法
boolean hasNext() 检查是否有下一个标记(以空格分隔)
String next() 读取下一个标记(字符串)
boolean hasNextLine() 检查是否有下一行
String nextLine() 读取下一行内容
类型检查方法
boolean hasNextInt() 检查下一个标记是否为整数
boolean hasNextDouble() 检查下一个标记是否为双精度浮点数
boolean hasNextBoolean() 检查下一个标记是否为布尔值
类型读取方法
int nextInt() 读取下一个整数
double nextDouble() 读取下一个双精度浮点数
boolean nextBoolean() 读取下一个布尔值
long nextLong() 读取下一个长整数
float nextFloat() 读取下一个单精度浮点数
short nextShort() 读取下一个短整数
byte nextByte() 读取下一个字节
分隔符控制
Scanner useDelimiter(String pattern) 设置分隔符模式
Scanner useDelimiter(Pattern pattern) 使用正则表达式设置分隔符
String delimiter() 返回当前使用的分隔符模式
其他方法
void close() 关闭扫描器
Scanner skip(Pattern pattern) 跳过匹配指定模式的输入
Scanner skip(String pattern) 跳过匹配指定字符串的输入
String findInLine(Pattern pattern) 在当前行中查找指定模式
String findInLine(String pattern) 在当前行中查找指定字符串
Scanner reset() 重置扫描器
Locale locale() 返回扫描器当前使用的区域设置
Scanner useLocale(Locale locale) 设置扫描器的区域设置

更多内容可以参考 API 文档:https://www.runoob.com/manual/jdk11api/java.base/java/util/Scanner.html

AI 思考中...

5 篇笔记 写笔记

  1. #0

    Mrodot

    mro***@qq.com

    131

    输入的时候字符都是可见的,所以Scanner类不适合从控制台读取密码。从Java SE 6开始特别引入了Console类来实现这个目的。若要读取一个密码,可以采用下面这段代码:

    Console cons = System.console();
    String username = cons.readline("User name: ");
    char[] passwd = cons.readPassword("Password: ");

    为了安全起见,返回的密码存放在一维字符数组中,而不是字符串中。在对密码进行处理之后,应该马上用一个填充值覆盖数组元素。

    采用Console对象处理输入不如采用Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或者一个数值的方法。

    Mrodot

    mro***@qq.com

    9年前 (2018年01月12日)
  2. #0

    通过StringTokenizer类可以分解输入的整行得到的带空格的字符串。默认情况下,StringTokenizer以空格,制表符,换行符和回车符作为分割依据。

    import java.util.Scanner;
    import java.util.StringTokenizer;
    class Main {
     public static void main(String[] args) {
     Scanner scanner=new Scanner(System.in);
     System.out.println("输入数据:");
     StringTokenizer stringTokenizer=new StringTokenizer(scanner.nextLine());
     System.out.println("分隔后:");
     while(stringTokenizer.hasMoreTokens()){
     System.out.println(stringTokenizer.nextToken());
     }
     }
    }

    测试结果:

    $ javac Main.java 
    $ java Main
    输入数据:
    runoob com
    分隔后:
    runoob
    com
    
    9年前 (2018年01月22日)
  3. #0

    jie

    132***[email protected]

    43

    Scanner 不仅能从输入流中读取,也能从文件中读取,除了构建 Scanner 对象的方法,其他和上文给出的完全相同,以下案例从一个名为 test.txt 的文件中读取整数。

    test.txt 文件内容:

    1
    2 
    3
    4
    5
    

    Fileio.java 文件内容:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    public class Fileio {
     public static void main(String[] args) throws FileNotFoundException {
     int[] arr=new int[10];
     int i=0;
     Scanner sc=new Scanner(new File("test.txt"));
     while(sc.hasNextInt()) {
     arr[i]=sc.nextInt();
     i++;
     }
     sc.close();
     System.out.printf("读取了 %d 个数\n",i);
     for(int j=0;j<i;j++) {
     System.out.println(arr[j]);
     }
     }
    }

    输出结果:

    读取了 5 个数
    1
    2
    3
    4
    5

    jie

    132***[email protected]

    9年前 (2018年01月29日)
  4. #0

    zzh学java

    hj0***[email protected]

    46

    处理接受整理和小数的逻辑时,需要在 else 的分支逻辑里把非整数的输入接收走,否则会影响后续 hasNextFloat 判断和接受小数的逻辑。

    Scanner scan = new Scanner(System.in);
    // 从键盘接收数据
    int i = 0;
    float f = 0.0f;
    System.out.print("输入整数:");
    if (scan.hasNextInt()) {
     // 判断输入的是否是整数
     i = scan.nextInt();
     // 接收整数
     System.out.println("整数数据:" + i);
    } else {
     scan.nextLine(); // 没接收到整数,把其他类型收掉,否则会影响到后边接受小数的逻辑
     // 输入错误的信息
     System.out.println("输入的不是整数!");
    }

    zzh学java

    hj0***[email protected]

    7年前 (2019年07月12日)
  5. #0

    你好,未来

    yan***[email protected]

    参考地址

    32

    关于Console类的一点小补充:如果直接在集成开发环境下执行代码会报错(我是在IntelliJ里面跑的)

    Exception in thread "main" java.lang.NullPointerException

    可以直接在命令提示符中采用javac XX.java , java XX的方式运行代码,可获得想要的效果。具体可见:

    https://coderanch.com/t/626329/java/readLine-method-System-Console-throwing

    你好,未来

    yan***[email protected]

    参考地址

    7年前 (2019年10月18日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /