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来获取用户从键 ...
随机推荐
- php xattr操作文件扩展属性
观摩了这篇文章后https://www.cnblogs.com/zyblog-coder/p/15013804.html 学到了php还有操作文件扩展属性的扩展 快速安装了一下 sudo apt-ge ...
- OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
前言 前面的相机hud可以单独显示图形,继续深入研究相机hud,技术就是子视图了,实现该功能的直接技术是从相机技术. 本篇描述osg从相机技术 Demo 相机视口的关键调用 ...
- 读书笔记-C#8.0本质论-02
10. 接口 10.1 显式与隐式接口实现的比较 10.1.1 隐式接口 namespace ConsoleApp1; internal static class Program { internal ...
- Java里快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- monitor磁盘空间不足警告
虚拟机安装ceph时,执行ceph -s monitor主机遇到了 mon c101(monitor主机名) is low on available space 错误 这是我找到的解决办法 monit ...
- c#之示波器功能
c#上位机:示波器功能 好久没有更新了,因为最近主要学习了如何用c#去做一个示波器功能,这里的示波器主要是用于单片机的调试.下面,我主要分享一下我做示波器的一些心得: 我这里示波器是用winform做 ...
- 《前端运维》一、Linux基础--12网络
这是linux部分的最后一篇内容,我们一起来学习下Linux网络. 我们先看些命令吧: ifconfig,查看与配置网络状态. netstat,查询网络状态,常用选项如下: -t,列出TCP协议端口 ...
- 《JavaScript 模式》读书笔记(7)— 设计模式1
这些模式已经出现了相当长的一段时间,并被证明在许多情况下都非常有用.这也是为什么需要自己熟悉并谈论这些模式的原因. 虽然这些设计模式是与语言和实现方式无关的,并且人们已经对此研究了多年,但都主要是从强 ...
- COSBrowser 移动端——随时随地查看管理数据
外出身边没有电脑,需要查看管理数据怎么办? 出现紧急情况,需要快速停止某个 bucket 对外访问,怎么办? 个人用户仅作为网盘使用,需要方便轻量的管理工具,怎么办? 不用着急,COSBrowser ...
- Specifications动态查询
[前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...