1. Scanner 的使用与分析

简介:

Scanner 是 Java 中一个用于解析原始类型(如 intdouble 等)和字符串的类。它通常从输入流中逐个读取数据并进行解析,支持多种分隔符的使用。其方法比较灵活,能够处理不同类型的数据输入。

常用方法:

  • 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的更多相关文章

  1. java 中的Scanner

    java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎 ...

  2. Java中的Scanner类

    java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入.创建Scanner对象的基本语法: Scanner s = new Scanner(System. ...

  3. Java -- 键盘输入 Scanner, BufferedReader。 系统相关System,Runtime。随机数 Randrom。日期操作Calendar

    1. Scanner 一个基于正则表达式的文本扫描器,他有多个构造函数,可以从文件,输入流和字符串中解析出基本类型值和字符串值. public class Main { public static v ...

  4. Java中使用Scanner类进行键盘的输入详解

    我们在使用Java写代码时,经常会遇到从键盘输入字符串等操作,这时候我们需要用到的是我们的Scanner类来实现获取用户从键盘上的输入操作. Scanner类是一个基于正则表达式的文本扫描器,它可以从 ...

  5. Java中的Scanner类和String类

    1:Scanner的使用(了解)    (1)在JDK5以后出现的用于键盘录入数据的类. (2)构造方法: A:讲解了System.in这个东西.            它其实是标准的输入流,对应于键 ...

  6. Java中利用Scanner键入的字符串与其他字符串的比较

    利用Scanner获取到键入的字符串与其他字符串作比较时,如果直接用关系运算符 == 比较,得到的结果总是false,因为实际比较的是两个变量引用的内存地址: 而要比较其内容是否相等,可以使用Obje ...

  7. Java基础之Scanner类中next()与nextLine()方法的区别

    java中使用Scanner类实现数据输入十分简单方便,Scanner类中next()与nextLine()都可以实现字符串String的获取,所以我们会纠结二者之间的区别. 其实next()与nex ...

  8. Java中输入判定的错误和纠正

    在编程过程中,很多技术人员看重程序的简洁性,效率性和包容性.其中最容易问到的就是假如输入数据不符合要求时的程序处理,这也是很多公司的机试题中应聘人员写出了符合功能要求的程序却并未通过面试的原因.下面是 ...

  9. Java中的变量,数据类型和运算符

    变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...

  10. Java中BufferedReader、InputStreamReader、Scanner和System.in区别

    Java中获取键盘输入值的方法以前写算法都是C/C++写的,现在用Java写,虽然算法是独立于语言的,但是Java从键盘获取输入确实有些不一样.在C/C++中我们可以用scanf和cin来获取用户从键 ...

随机推荐

  1. JS 正则表示式 字符串匹配 忽略大小写

    在项目中遇到了需要使用字符串进行正则匹配,同时还要忽略大小写可以按照以下方法:1 先使用new RegExp(newVal, 'i')生成需要匹配的规则,其中 'i' 表示忽略大小写2 再对相应的字符 ...

  2. Java线程池Executors

    一 简述 线程池,作为一个管理一组同构工作线程的资源.接受提交的任务,利用线程池中的线程进行工作的处理. 在另一篇<Java多线程设计模式(4)线程池模式>利用非Executors描述了线 ...

  3. laravel之任务调度(定时任务)

    crontab指令线性增长.毕竟crontab是一项系统级的配置,在业务中我们为了节约机器,往往对于量不大的多个项目会放在同一台服务器上,crontab指令多了就容易管理混乱,并且功能也不够灵活强大( ...

  4. PHP7.4之编译安装

    虽然之前写过很多编译安装PHP的文章, 但是隔段时间还是会重新安装一些PHP的版本,再次记录一下 1. 下载安装编译工具 yum groupinstall 'Development Tools' 2. ...

  5. elasticsearch之python操作

    总结使用python对于elasticsearch的常用操作 安装 pip install elasticsearch 2. 连接 from elasticsearch import Elastics ...

  6. Linux内核内存保护机制:aslr和canary

    Linux内核内存保护机制:aslr和canary ASLR ASLR技术,全称为Address space layout randomization(地址空间布局随机化),是现代通用操作系统基本都会 ...

  7. sql 依据时间间隔分组,获取第一条数据

    时序数据的数据量比较大,抛去异常点外,变化相对比较有线性规律,业务上需要对结果进行抽取显示. 原始数据时序标签(部分示例) 根据时间字段,计算时间字段和指定时间的时间戳差值,然后除以固定间隔(示例中间 ...

  8. 基于 .NET 的 Nuget 发版工具

    背景 由于 Natasha 及周边项目发版任务多,文件结构也不简单,之前一直使用基于 Github 管道脚本和 XUnit 来发版.这个方案对于发版环境与条件依赖性较强,且不够灵活,因此萌生出做一个本 ...

  9. Docker Logs清理

    查看docker日志路径 docker inspect --format='{{.LogPath}}' <container_name_or_id> 清理docker日志 echo |su ...

  10. JDK 19 对反应式编程的批判

    我们知道 JDK 19 引入了虚拟线程,实现了 JEP425 草案,https://openjdk.org/jeps/425 该案对反应式编程的批判可谓犀利: Improving scalabilit ...