Java StringTokenizer 类 Scanner 类详解

news/2025/11/16 19:05:41/文章来源:https://www.cnblogs.com/SutsuharaYuki/p/19228740

Java StringTokenizer 类介绍

概述

StringTokenizer 是一个遗留类,用于将字符串分割成标记(tokens)。

但在现代 Java 开发中已被更强大的 String.split() 和 Scanner 类取代,新项目应使用更现代的解决方案。

基本用法

1. 构造方法

// 1. 默认分隔符(空格、制表符、换行符等)
StringTokenizer st1 = new StringTokenizer("Hello World Java");
// 2. 指定分隔符
StringTokenizer st2 = new StringTokenizer("A,B,C", ",");
// 3. 指定分隔符并返回分隔符
StringTokenizer st3 = new StringTokenizer("A,B,C", ",", true);

方法

 
方法描述
hasMoreTokens() 是否还有更多标记
nextToken() 返回下一个标记
countTokens() 返回剩余标记数量
hasMoreElements() 同 hasMoreTokens()
nextElement() 同 nextToken(),返回 Object

详细示例

示例1:基本分割

public class BasicExample {public static void main(String[] args) {String data = "Java;Python;JavaScript;C++";StringTokenizer st = new StringTokenizer(data, ";");System.out.println("Token数量: " + st.countTokens());while (st.hasMoreTokens()) {System.out.println("语言: " + st.nextToken());}}
}

示例2:CSV解析

public class CSVExample {public static void main(String[] args) {String csv = "John,25,Developer,New York";StringTokenizer st = new StringTokenizer(csv, ",");System.out.println("姓名: " + st.nextToken());System.out.println("年龄: " + st.nextToken());System.out.println("职业: " + st.nextToken());System.out.println("城市: " + st.nextToken());}
}

示例3:复杂分隔符

public class ComplexDelimiter {public static void main(String[] args) {String text = "Apple and Banana or Cherry but not Date";StringTokenizer st = new StringTokenizer(text, " andorbutnot");while (st.hasMoreTokens()) {System.out.println(st.nextToken());}// 输出: Apple, Banana, Cherry, Date
    }
}

现代替代方案

使用 String.split()(推荐)

public class SplitAlternative {public static void main(String[] args) {String text = "Apple,Banana,Cherry";// 简单分割String[] fruits = text.split(",");for (String fruit : fruits) {System.out.println(fruit);}// 正则表达式分割String complexText = "A1,B2,C3";String[] items = complexText.split(",\\d");for (String item : items) {System.out.println(item);}}
}

使用 Scanner 类

import java.util.Scanner;public class ScannerAlternative {public static void main(String[] args) {String text = "Apple Banana Cherry";Scanner scanner = new Scanner(text);while (scanner.hasNext()) {System.out.println(scanner.next());}scanner.close();}
}

优缺点

优点

  • 简单易用。内存效率较高(不创建数组)。适合大字符串处理。

缺点

  • 功能有限。不支持正则表达式。遗留类,不推荐在新代码中使用

使用建议

不建议在新项目中使用 StringTokenizer,推荐替代方案:

// 1. 简单分割 - 使用 String.split()
String[] parts = text.split(",");// 2. 复杂分割 - 使用 Pattern/Matcher
Pattern pattern = Pattern.compile("\\s+");
String[] words = pattern.split(text);// 3. 流式处理 - 使用 Java 8 Stream
Arrays.stream(text.split(",")).map(String::trim).filter(s -> !s.isEmpty()).forEach(System.out::println);

 

 

Java Scanner 类详解

概述

Scanner 是一个强大的文本扫描器,可以解析原始类型和字符串使用正则表达式。它提供了多种输入解析功能。

基本用法

1. 创建 Scanner 对象

import java.util.Scanner;public class ScannerBasic {public static void main(String[] args) {// 从标准输入创建Scanner scanner = new Scanner(System.in);// 从字符串创建Scanner stringScanner = new Scanner("Hello 123 45.67 true");// 从文件创建Scanner fileScanner = new Scanner(new File("data.txt"));}
}

核心方法

读取不同类型数据

public class ScannerTypes {public static void main(String[] args) {Scanner sc = new Scanner("John 25 75000.50 true");// 读取不同类型String name = sc.next();        // Johnint age = sc.nextInt();         // 25double salary = sc.nextDouble(); // 75000.50boolean active = sc.nextBoolean(); // trueSystem.out.printf("姓名: %s, 年龄: %d, 薪资: %.2f, 状态: %b%n", name, age, salary, active);}
}

用户输入示例

import java.util.Scanner;public class UserInputExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入姓名: ");String name = scanner.nextLine();System.out.print("请输入年龄: ");int age = scanner.nextInt();System.out.print("请输入薪资: ");double salary = scanner.nextDouble();// 清除缓冲区
        scanner.nextLine();System.out.print("请输入城市: ");String city = scanner.nextLine();System.out.printf("员工信息: %s, %d岁, 薪资%.2f, 城市%s%n", name, age, salary, city);
scanner.close();} }

 

常用方法总结

 
方法描述
next() 读取下一个字符串
nextLine() 读取下一行
nextInt() 读取下一个整数
nextDouble() 读取下一个双精度数
nextBoolean() 读取下一个布尔值
hasNext() 检查是否还有输入
hasNextInt() 检查下一个是否是整数
useDelimiter() 设置分隔符模式
close() 关闭扫描器

高级功能

1. 分隔符控制

public class DelimiterExample {public static void main(String[] args) {String data = "Apple,Banana;Cherry:Date";Scanner sc = new Scanner(data);// 设置自定义分隔符(正则表达式)sc.useDelimiter("[,;:]");
while (sc.hasNext()) {System.out.println(sc.next().trim());}sc.close();} }

2. 区域设置

import java.util.Locale;public class LocaleExample {public static void main(String[] args) {String numbers = "1,234.56 7.890,12";// 使用美国区域设置Scanner usScanner = new Scanner(numbers);usScanner.useLocale(Locale.US);System.out.println("US: " + usScanner.nextDouble()); // 1234.56// 使用德国区域设置Scanner deScanner = new Scanner(numbers);deScanner.useLocale(Locale.GERMANY);deScanner.next(); // 跳过第一个数字System.out.println("DE: " + deScanner.nextDouble()); // 7890.12
    }
}

3. 模式匹配

import java.util.regex.Pattern;public class PatternExample {public static void main(String[] args) {String text = "年龄:25 薪资:50000 部门:IT";Scanner sc = new Scanner(text);// 查找特定模式Pattern agePattern = Pattern.compile("年龄:(\\d+)");Pattern salaryPattern = Pattern.compile("薪资:(\\d+)");while (sc.hasNext()) {if (sc.hasNext(agePattern)) {String age = sc.findInLine(agePattern);System.out.println("找到年龄: " + age);} else if (sc.hasNext(salaryPattern)) {String salary = sc.findInLine(salaryPattern);System.out.println("找到薪资: " + salary);} else {sc.next(); // 跳过不匹配的内容
            }}sc.close();}
}

实用示例

1. 文件读取

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class FileScannerExample {public static void main(String[] args) {try {Scanner fileScanner = new Scanner(new File("data.txt"));while (fileScanner.hasNextLine()) {String line = fileScanner.nextLine();System.out.println("行内容: " + line);}fileScanner.close();} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());}}
}

2. CSV 解析

public class CSVScanner {public static void main(String[] args) {String csvData = "John,Doe,25,Developer\nJane,Smith,30,Manager";Scanner sc = new Scanner(csvData);while (sc.hasNextLine()) {String line = sc.nextLine();Scanner lineScanner = new Scanner(line);lineScanner.useDelimiter(",");String firstName = lineScanner.next();String lastName = lineScanner.next();int age = lineScanner.nextInt();String job = lineScanner.next();System.out.printf("%s %s, %d岁, %s%n", firstName, lastName, age, job);lineScanner.close();}sc.close();}
}

最佳实践

1. 资源管理

// 使用 try-with-resources 自动关闭
public class ResourceManagement {public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {System.out.print("请输入内容: ");String input = scanner.nextLine();System.out.println("你输入了: " + input);}// scanner 自动关闭
    }
}

2. 性能考虑

public class PerformanceTips {public static void main(String[] args) {// 对于大文件,设置合适的缓冲区try (Scanner sc = new Scanner(new File("large.txt"))) {sc.useDelimiter("\\R"); // 行分隔符while (sc.hasNext()) {String line = sc.next();// 处理每一行
            }} catch (Exception e) {e.printStackTrace();}}
}

Scanner 类的优势:

  • 简单易用的输入解析。支持多种数据类型。灵活的分隔符控制。强大的正则表达式支持。

注意事项:

  • 记得关闭 Scanner 对象。注意输入缓冲区问题。大文件处理考虑性能。生产环境考虑更专业的解析库。

 
 
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:Open Inventor 2025.2 FOR JAVA

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

25.11.15随笔联考总结(补)

考试 开考通读题面,感觉第一题很简单,看 T2,感觉是一个比较好做的计数,T3 给人一种点分治的感觉,T4 挺神秘的不清楚。开考半个小时后决定回去验证 T1 正确性,发现假了,重新思考,想了可能有 20 多分钟大概会了,…

Java 断言(Assert) 简介

什么是断言? 断言是一种调试工具,用于在代码中检查必须为真的条件。如果条件为假,JVM 会抛出 AssertionError。 核心特点:调试工具:主要用于开发测试阶段默认禁用:需要手动启用快速失败:条件不满足时立即终止不…

2025年中小学生 AI 学习机选购指南:松鼠 AI 双线模式成优选

2025年中小学生 AI 学习机选购指南:松鼠 AI 双线模式成优选一、首选松鼠AI学习机:双线融合的“精准提分专家” 作为2025年AI教育领域的黑马品牌,松鼠AI以“AI学习机+全国1200+自习室”的创新模式,打破传统学习机“…

《重生之我成为世界顶级黑客》第六章:一线生机

《重生之我成为世界顶级黑客》第六章:一线生机已经尽可能把敏感的去掉了,不知道帖子能存在多久。唉,不让聊的。清晨六点半,龙傲天准时被闹钟唤醒。胃部的隐痛已经成了每日的例行公事,他机械地吞下一片胃药,用冷水…

20232305 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1掌握基本的信息搜集方法 1.2学习并掌握端口扫描及漏洞扫描技术 1.3利用所学知识对自己隐私加以保护 2.实验过程 2.1从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取信息 2.…

遥感建筑物变化检测内容集

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:IntelliJ IDEA 2023中为 Spring Boot 项目添加注释模板

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【UE源码向】GameplayTag增加ToolTip

GamepayTag 的 ToolTip 增加 DevComment我想绝大部分的 UE 项目都会大量使用到 GameplayTag 的功能,主要是用来做一些功能分类、状态标记和资产引用。 问题:在引擎的早期版本中(< 5.6),GameplayTag 的鼠标悬浮…

基于c++ eigen的Nelder-Mead算法(仿照scipy)

简介 本文展示了用C++(Eigen)实现的Nelder-Mead算法,该实现仿照了Python SciPy库中的scipy.optimize.fmin函数。虽然目前仅完成了基础功能(fmin不支持full_output和retall),但已经可以应用于实际优化问题。 Nelder…

量化存储墙(三):GEMM EMA 下限解析解以及硬件静态资源分配设计

Roofline 缺失的一角:EMA 计算-存储工艺各自单独演化发展步调不一, Memory Wall 在 AI 计算时代越来越显著[1]。Roofline Model 将计算/存储,软件/硬件用一个简洁优雅的统一模型概括,然而带入具体数值求解时,硬件…

Docker - 配置镜像站解决下载镜像的网络问题

Docker - 配置镜像站解决下载镜像的网络问题 {"registory-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live","https://hub.rat.dev"] } sudo servic…

2D3D-MATR论文学习

背景 典型的2D3D配准的核心任务是求解一个将点云对齐到图像坐标系下的刚体变换(旋转和平移)。 为了实现这一目的,常见的执行步骤如下 (1)建立对应关系 即找出图像的关键点和点云的关键点,然后将位置相同的关键点…

c# 获取当前时间

c# 获取当前时间void Main() {var time = GetNetworkTime();time.Dump(); }public static DateTime GetNetworkTime(string ntpServer = "cn.pool.ntp.org") {try{// NTP消息结构(48字节)byte[] ntpData =…

YOLOv3 深度解析:网络架构、核心改进与目标检测实践 - 指南

YOLOv3 深度解析:网络架构、核心改进与目标检测实践 - 指南2025-11-16 18:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

ai学习机是不是智商税?到底有没有用?2025年学习机推荐指南

ai学习机是不是智商税?到底有没有用?2025年学习机推荐指南结论:AI学习机并非简单的“智商税”,但也不是万能神器。其价值高度依赖于产品真实的技术实力和是否契合孩子的学习需求。 🤔 一、AI学习机是智商税吗? …

Linux问题

Linux问题 一、问题优先级 highest、high、medium、low(高、中、低) 二、常见问题 1、segmentation fault(core dumped) 含义:“程序发生了内存访问违规,已被系统终止,并生成了核心转储文件。”含义:当程序试图访…

2025 年 11 月石笼网厂家最新推荐,实力品牌深度解析采购无忧之选!

在全球水利防护、交通建设等工程领域,石笼网品牌实力直接决定采购安全性与工程可靠性。据国际丝网产业协会(ISIA)2025 年 11 月测评数据,全球仅 35% 的石笼网品牌同时满足产能达标、专利认证、售后响应及时三大核心…

docker命令提示插件

安装Docker命令提示插件 安装Docker命令提示插件可以提供命令补全与命令提示的功能。对于bash Shell,可以使用以下命令安装curl -L -o /etc/bash_completion.d/docker 对于zsh Shell,可以使用以下命令安装curl -L -o…