目录
- 前言:
- Scanner是什么?
- 导入 Scanner 类
- Scanner有多个输入源
- InputStream(字节输入流)
- File(文件)
- String(字符串)
- Readable(可读对象接口)
- Path(Java NIO 路径)
- Channel或其他ReadableByteChannel(通过InputStream包装)
- 标准输出流的控制台输入
- 导入包和创建一个 Scanner 对象
- 导包
- 创建对象
- 读取数据
- 字符串
- next()
- nextLine()
- 整数
- nextInt()
- nextLong()
- nextShort()
- nextByte()
- 浮点数
- nextDouble()
- nextFloat()
- 判断类型
- hasNext()
- hasNextLine()
- 结束输入
- 判断用户输入的是小数还是整数
- 求用户输入的数的总和、平均值
- 结尾
前言:
学完Java基础,开始学习流程控制。本文将介绍Scanner类是什么?标准输出流该怎么使用以及两种获取字符串的方式和判断输入的数据,最后进行实战。
Scanner是什么?
Scanner是 Java 标准库java.util包下的一个工具类(Java5新特性),专门用于读取外部输入数据(如控制台输入、文件内容、字符串流等),提供了简洁的方法来解析不同类型的输入(字符串、整数、浮点数等),替代了早期BufferedReader等较繁琐的输入方式。
导入 Scanner 类
使用前需导入包(Java 中非java.lang包的类必须显式导入)
importjava.util.Scanner;Scanner有多个输入源
InputStream(字节输入流)
这是最常见的用法之一,如从标准输入(键盘)读取
Scannerscanner=newScanner(System.in)// 这里的System.in 就是InputStream也可以传入其他InputStream,比如文件或网络流
InputStreaminput=newFileInputStream("file.txt");Scannerscanner=newScanner(input);File(文件)
可以直接从文件创建Scanner
Scannerscanner=newScanner(newFile("data.txt"));Paths.get():
Scannerscanner=newScanner(Paths.get("data.txt"));⚠️ 需要处理
FileNotFoundException。
String(字符串)
从一个字符串构造Scanner,用于解析字符串内容
Stringdata="Hello 123 World";Scannerscanner=newScanner(data);一般用于测试或处理内存中的文本。
Readable(可读对象接口)
可以接收任何实现了Readable接口的对象(比如 BufferedReader、CharBuffer等)
BufferedReaderreader=newBufferedReader(newFileReader("file.txt"));Scannerscanner=newScanner(reader);Path(Java NIO 路径)
使用 java.nio.file.path来指定文件
Pathpath=Paths.get("example.txt");Scannerscanner=newScanner(path);Channel或其他ReadableByteChannel(通过InputStream包装)
虽然不能直接传 Channel,但可以通过Channel.newInputStream(channel)转换为 InputStream
ReadableByteChannelchannel=...;InputStreamin=Channels.newInputStream(channel);Scannerscanner=newScanner(in);标准输出流的控制台输入
这里只讲基础中最常用的控制台输入,及System.in,这里的in就是input
导入包和创建一个 Scanner 对象
导包
importjava.util.Scanner创建对象
Scannerscanner=newScanner(System.in)读取数据
字符串
next()
Stringstr=scanner.next();// 输入 Hello World 读取 HellonextLine()
Stringstr=scanner.nextLine();// 输入 Hello World 读取 Hello Worldnext():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白符作为分隔符或者结束符
- next() 不能得到带有空格的字符串
nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
整数
nextInt()
intint1=scanner.nextInt();// 输入 1 读取 1 | 输入 0.1 报错nextLong()
longlong1=scanner.nextLont();// 输入 111 读取 111nextShort()
shortshort1=scanner.nextShort();// 输入 111 读取 111nextByte()
bytebyte1=scanner.nextByte();// 输入 10 读取 10 输入 aaa 报错浮点数
nextDouble()
doubledouble1=scanner.nextDouble();// 输入 1.1 读取 1.1 输入 1 读取 1.0nextFloat()
floatfloat1=scanner.nextFloat();// 输入1.1 读取 1.1判断类型
hasNext()
scanner.hasNext()hasNextLine()
scanner.hasNextLine()其他的都一样,把后面的类型改一下就可以
结束输入
凡是属于IO流的类如果不关闭会一只占用资源,要养成好习惯用完就关掉
scanner.close();判断用户输入的是小数还是整数
importjava.util.Scanner;publicclassDemo01{publicstaticvoidmain(String[]args){// 从键盘接收数据Scannerscanner=newScanner(System.in);inti=0;floatf=0.0f;System.out.println("请输入整数:");// 如果......那么if(scanner.hasNextInt()){i=scanner.nextInt();System.out.println("整数数据:"+i);}else{System.out.println("输入的不是整数数据!");}System.out.println("请输入小数:");if(scanner.hasNextFloat()){f=scanner.nextFloat();System.out.println("小数数据:"+f);}else{System.out.println("输入的不是小数数据!");}scanner.close();}}求用户输入的数的总和、平均值
importjava.util.Scanner;publicclassDemo05{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 和doublesum=0;// 计算输入了多少个数字intm=0;// 通过循环内判断是否还有输入,并在里面对每一次进行求个和和统计while(scanner.hasNextDouble()){doublex=scanner.nextDouble();m=m+1;// m++sum=sum+x;System.out.println("你输入了第"+m+"个数据,然后当前结果sum="+sum);}System.out.println(m+"个数的和为:"+sum);System.out.println(m+"个数的平均值是:"+(sum/m));scanner.close();}}结尾
其实 Scanner 更适合简单场景的快速开发,如果你的项目需要处理高并发输入、超大文本,或者对性能有更高要求,不妨试试 BufferedReader 或 Java 8 后的 Stream API 技术没有最优解,只有最适合当前场景的选择
⭐ 如果这对你有帮助,不妨收藏和分享一下!