Java中的Scanner、BufferedReader 和 StreamTokenizer
1. Scanner 的使用与分析
简介:
Scanner 是 Java 中一个用于解析原始类型(如 int、double 等)和字符串的类。它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使用。其方法比较灵活,能够处理不同类型的数据输入。
常用方法:
nextLine():读取一行文本。nextInt():读取一个整数。nextDouble():读取一个浮点数。next():读取一个单词。
性能:
Scanner 相较于 BufferedReader 在性能上稍逊一筹,尤其是在大量数据输入时,因为每次读取时都要进行格式检查和解析。
错误处理:
Scanner 在读取不符合格式的数据时,通常会抛出异常,需要通过异常处理来管理。
适用场景:
适用于简单、格式规范的输入,尤其是处理基本数据类型的输入时。
代码示例:Scanner 的基本使用
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter a string:");
String inputString = scanner.nextLine(); // 读取一行文本
System.out.println("You entered: " + inputString);
System.out.println("Enter an integer:");
int inputInt = scanner.nextInt(); // 读取整数
System.out.println("You entered the number: " + inputInt);
System.out.println("Enter a double:");
double inputDouble = scanner.nextDouble(); // 读取浮点数
System.out.println("You entered the double: " + inputDouble);
scanner.close();
}
}
2. BufferedReader 的使用与分析
简介:
BufferedReader 是 Java 中一个用于读取字符输入流的类。它提供了缓冲功能,可以减少每次读取时的 I/O 操作,从而提高性能。通常,BufferedReader 用于逐行读取数据。
常用方法:
readLine():读取一行文本。read():读取单个字符。
性能:
BufferedReader 通过缓冲机制提高了读取大量数据的性能,尤其是在处理文件读取时表现得尤为明显。
错误处理:
BufferedReader 对于错误的输入通常不会抛出异常,而是返回 null,需要显式判断和处理。
适用场景:
适用于处理大量文本输入,尤其是对性能有较高要求的场景。它适合从文件或者标准输入中读取大块数据。
代码示例:BufferedReader 的基本使用
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Enter a line of text:");
String input = reader.readLine(); // 读取一行文本
System.out.println("You entered: " + input);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3. StreamTokenizer 的使用与分析
简介:
StreamTokenizer 是 Java 中用于将输入流分割为标记(tokens)的类。它通过读取字符流并按指定规则将输入流中的字符切割为有意义的单词、数字等标记,适合用来解析结构化文本。
常用方法:
nextToken():读取下一个标记。ttype:标记的类型(如单词、数字等)。sval:当前标记的字符串值。nval:当前标记的数字值。
性能:
StreamTokenizer 在解析文本时性能较高,因为它以流的形式逐字符地读取输入,不会占用过多内存。
错误处理:
StreamTokenizer 在遇到无法识别的字符时会跳过,直到下一个有效的标记。它通常不会抛出异常。
适用场景:
适用于需要精确控制标记化输入流的场景,尤其是在文本分析和解析时。
代码示例:StreamTokenizer 的基本使用
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static void main(String[] args) throws IOException {
int n = nextInt();
}
public static int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.StreamTokenizer;
public class StreamTokenizerExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter some text:");
processTokens(reader); // 处理输入的标记
}
/**
* 处理输入的文本并打印每个标记。
* @param reader 输入流
* @throws IOException 读取流时抛出的异常
*/
public static void processTokens(BufferedReader reader) throws IOException {
// 创建 StreamTokenizer 对象
StreamTokenizer tokenizer = new StreamTokenizer(reader);
// 遍历输入流,处理每个标记
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
processTokenByType(tokenizer); // 根据标记类型处理
}
}
/**
* 根据不同的标记类型处理输入
* @param tokenizer StreamTokenizer 对象
*/
public static void processTokenByType(StreamTokenizer tokenizer) {
try {
switch (tokenizer.ttype) {
case StreamTokenizer.TT_WORD:
System.out.println("Word: " + tokenizer.sval); // 处理单词
break;
case StreamTokenizer.TT_NUMBER:
System.out.println("Number: " + tokenizer.nval); // 处理数字
break;
case StreamTokenizer.TT_EOL:
System.out.println("End of line encountered."); // 处理行结束符
break;
case StreamTokenizer.TT_EOF:
// EOF 不需要处理
break;
default:
System.out.println("Other: " + (char) tokenizer.ttype); // 处理其他字符
break;
}
} catch (IOException e) {
// 统一抛出异常
throw new RuntimeException("Error processing the token", e);
}
}
}
总结
Scanner适用于简单、格式规范的输入,尤其是在处理基本数据类型时非常方便。其优势在于灵活性,但性能较BufferedReader差。BufferedReader适用于处理大块文本输入,特别是在处理文件数据时。通过缓冲机制,BufferedReader提供了较高的性能。StreamTokenizer适用于复杂的文本解析,能够根据不同的词法规则分割输入流,并且能够灵活地处理各种标记。
Java中的Scanner、BufferedReader 和 StreamTokenizer的更多相关文章
- java 中的Scanner
java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎 ...
- Java中的Scanner类
java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入.创建Scanner对象的基本语法: Scanner s = new Scanner(System. ...
- Java -- 键盘输入 Scanner, BufferedReader。 系统相关System,Runtime。随机数 Randrom。日期操作Calendar
1. Scanner 一个基于正则表达式的文本扫描器,他有多个构造函数,可以从文件,输入流和字符串中解析出基本类型值和字符串值. public class Main { public static v ...
- Java中使用Scanner类进行键盘的输入详解
我们在使用Java写代码时,经常会遇到从键盘输入字符串等操作,这时候我们需要用到的是我们的Scanner类来实现获取用户从键盘上的输入操作. Scanner类是一个基于正则表达式的文本扫描器,它可以从 ...
- Java中的Scanner类和String类
1:Scanner的使用(了解) (1)在JDK5以后出现的用于键盘录入数据的类. (2)构造方法: A:讲解了System.in这个东西. 它其实是标准的输入流,对应于键 ...
- Java中利用Scanner键入的字符串与其他字符串的比较
利用Scanner获取到键入的字符串与其他字符串作比较时,如果直接用关系运算符 == 比较,得到的结果总是false,因为实际比较的是两个变量引用的内存地址: 而要比较其内容是否相等,可以使用Obje ...
- Java基础之Scanner类中next()与nextLine()方法的区别
java中使用Scanner类实现数据输入十分简单方便,Scanner类中next()与nextLine()都可以实现字符串String的获取,所以我们会纠结二者之间的区别. 其实next()与nex ...
- Java中输入判定的错误和纠正
在编程过程中,很多技术人员看重程序的简洁性,效率性和包容性.其中最容易问到的就是假如输入数据不符合要求时的程序处理,这也是很多公司的机试题中应聘人员写出了符合功能要求的程序却并未通过面试的原因.下面是 ...
- Java中的变量,数据类型和运算符
变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...
- Java中BufferedReader、InputStreamReader、Scanner和System.in区别
Java中获取键盘输入值的方法以前写算法都是C/C++写的,现在用Java写,虽然算法是独立于语言的,但是Java从键盘获取输入确实有些不一样.在C/C++中我们可以用scanf和cin来获取用户从键 ...
随机推荐
- 鸿蒙NEXT开发案例:随机数生成
[引言] 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表.生成的结果可以通过点击"复制"按钮复制到剪 ...
- 符合ASTM标准的雨流计数法及其不同的改进方法
随着研究的深入,人们发现采用时间序列计算载荷谱太麻烦了,处理的工作量太大,我们不需要将每个时刻点的载荷都做运算,疲劳计算只需要提供幅值.均值和循环次数,鉴于此发展出了很多不同的计数方法,雨流法是最常见 ...
- nvidia公司的机器人仿真环境的历史发展介绍(Isaac-Gym、Isaac-Sim)
相关: NVIDIA机器人仿真项目 -- Isaac Gym - Preview Release 本文说下NVIDIA公司的机器人仿真项目的一些历史发展. NVIDIA公司的产品最初只有显卡,但是卖着 ...
- windows下执行Python脚本
由于业务需要,有些python脚本需要在Windows系统上,并且支持定时执行 1) 一. 创建.bat批处理文件 新创建文件并将扩展名改为.bat 二. 写入执行python脚本的语句 @echo ...
- 从零开始学java(第二天)
------------恢复内容开始------------ 今天是学习了一些基础的知识 1.注释 //行注释 /*多行注释*/ /**文档注释*/ 2.标识符和关键字 标识符就是名字,类名方法名变量 ...
- java/spring项目打成jar包供第三方引用方案
分类 单独工具类 比如StringUtils 注入类工具类 实现 单独工具类 将项目打jar包 项目结构 开始打包: 在目标项目中pom引用直接使用 注入类工具类 当我们想要利用SpringBoot封 ...
- 解析JDBC使用查询MySQL【非流式、流式、游标】
解析JDBC使用游标查询MySQL 使用jdbc查询MySQL数据库,如果使用游标或者流式查询的话,则可以有效解决OOM的问题,否则MySQL驱动就会把数据集全部查询出来加载到内存里面,这样在大数据的 ...
- Ant Design Pro项目一初始化就报a标签嵌套a标签错误<a> cannot as a descendant of <a>
前情 公司经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 坑位 按官方文挡一步步下来,项 ...
- 【并查集+dfs】codeforces 1833 E. Round Dance
题意 输入一个正整数 \(T(1 \leq T \leq 10^4)\),表示接下来输入 \(T\) 组测试用例,对于每一个测试用例: 第一行,输入一个正整数 \(n(2 \leq n \leq 2 ...
- openEuler欧拉安装指定版本的nodejs
1. 安装nodejs dnf -y install nodejs npm config set registry https://registry.npmmirror.com -g npm conf ...