(每日持续更新)jdk api之StreamTokenizer基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入“java基础课程”,即可免费获得全套架构师全套课程

一、java.io

1.70 StreamTokenizer

基本概念

StreamTokenizer 类用于将输入流解析为标记(tokens),例如数字、字符串和特殊字符。它是一个强大的工具,常用于分析简单的文本数据,例如配置文件、日志文件等。以下是关于 StreamTokenizer 的介绍、属性、构造方法、方法以及一个简单的例子:

介绍:

  • StreamTokenizer 类允许将输入流(Reader 对象)解析为标记(tokens),并允许以不同的方式处理这些标记。

属性:

  • nval:包含当前标记的数值(如果当前标记是数字),否则为 0.0。

  • sval:包含当前标记的字符串值(如果当前标记是字符串),否则为 null

  • ttype:指示当前标记的类型。可能的值有:TT_EOF(-1,表示输入流的末尾)、TT_EOL(10,表示换行符)、TT_NUMBER(表示一个数字)、TT_WORD(表示一个单词)以及具体的字符值(例如 ',')。

构造方法:

  • StreamTokenizer(Reader r):创建一个新的 StreamTokenizer 对象,使用指定的 Reader 对象作为输入流。

方法:

  • nextToken():读取下一个标记并返回其类型。

  • ordinaryChar(int ch):指定字符 ch 为“普通字符”,即不被视为分隔符。

  • resetSyntax():将当前的语法设置为默认设置。

  • 等等,还有其他方法用于设置和获取解析器的各种属性。

简单的例子:

以下是一个简单的例子,演示了如何使用 StreamTokenizer 来解析一段文本并提取数字和单词:

javaCopy code
import java.io.*;
​
public class StreamTokenizerExample {
    public static void main(String[] args) {
        String text = "The quick brown fox jumps over 123 the lazy dog.";
        try {
            // 创建输入流
            StringReader stringReader = new StringReader(text);
            StreamTokenizer tokenizer = new StreamTokenizer(stringReader);
​
            // 设置特定字符为普通字符,不被视为分隔符
            tokenizer.ordinaryChar('.');
​
            // 解析文本并提取标记
            while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
                switch (tokenizer.ttype) {
                    case StreamTokenizer.TT_NUMBER:
                        System.out.println("数字:" + tokenizer.nval);
                        break;
                    case StreamTokenizer.TT_WORD:
                        System.out.println("单词:" + tokenizer.sval);
                        break;
                    default:
                        // 其他字符(如标点符号)或换行符
                        if (tokenizer.ttype == '\n') {
                            System.out.println("换行符");
                        } else {
                            System.out.println("其他字符:" + (char) tokenizer.ttype);
                        }
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们创建了一个 StreamTokenizer 对象,将一段文本传递给它进行解析。然后,我们使用 nextToken() 方法逐个读取标记,并根据标记的类型进行处理。如果标记是数字,我们输出其数值;如果是单词,我们输出其字符串值;如果是其他字符(如标点符号)或换行符,则作出相应的处理。

应用场景

StreamTokenizer 在处理文本数据时非常有用。以下是一些常见的应用场景及其对应的代码实现:

  1. 简单文本解析: 可以使用 StreamTokenizer 对文本进行简单的解析,提取其中的数字、单词和特殊字符。

javaCopy code
import java.io.*;
​
public class SimpleTextParsing {
    public static void main(String[] args) {
        String text = "The price of the product is $25.50 and the discount is 10%.";
        try {
            StringReader stringReader = new StringReader(text);
            StreamTokenizer tokenizer = new StreamTokenizer(stringReader);
            while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
                if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
                    System.out.println("单词:" + tokenizer.sval);
                } else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
                    System.out.println("数字:" + tokenizer.nval);
                } else {
                    System.out.println("其他字符:" + (char) tokenizer.ttype);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.配置文件解析: 可以使用 StreamTokenizer 解析简单的配置文件,提取其中的配置项和对应的值。

javaCopy code
import java.io.*;
​
public class ConfigFileParsing {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("config.txt");
            StreamTokenizer tokenizer = new StreamTokenizer(fileReader);
            while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
                if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
                    String key = tokenizer.sval;
                    tokenizer.nextToken(); // 读取等号
                    if (tokenizer.ttype == '=') {
                        tokenizer.nextToken(); // 读取值
                        String value = tokenizer.sval;
                        System.out.println("配置项:" + key + ", 值:" + value);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.词法分析器: 可以使用 StreamTokenizer 编写简单的词法分析器,将源代码分解为标记,并进行进一步的处理。

javaCopy code
import java.io.*;
​
public class LexicalAnalyzer {
    public static void main(String[] args) {
        String sourceCode = "int a = 10; float b = 20.5;";
​
        try {
            StringReader stringReader = new StringReader(sourceCode);
            StreamTokenizer tokenizer = new StreamTokenizer(stringReader);
            tokenizer.parseNumbers(); // 允许解析数字
            tokenizer.wordChars('_', '_'); // 允许下划线在单词中出现
​
            while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
                switch (tokenizer.ttype) {
                    case StreamTokenizer.TT_WORD:
                        System.out.println("单词:" + tokenizer.sval);
                        break;
                    case StreamTokenizer.TT_NUMBER:
                        System.out.println("数字:" + tokenizer.nval);
                        break;
                    case '=':
                        System.out.println("赋值符号");
                        break;
                    case ';':
                        System.out.println("分号");
                        break;
                    default:
                        System.out.println("其他字符:" + (char) tokenizer.ttype);
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这些示例中,我们演示了 StreamTokenizer 的不同应用场景,包括简单文本解析、配置文件解析和词法分析器。StreamTokenizer 提供了一种简单而灵活的方法来处理文本数据,并根据需要提取所需的信息。

实战例子

以下是一个项目实战示例,展示了如何使用 StreamTokenizer 解析一个简单的配置文件,并根据配置文件的内容执行相应的操作。

假设我们有一个名为 ConfigParser 的类,它负责解析配置文件,并根据配置执行不同的操作。配置文件的格式如下:

Copy code
database.host=localhost
database.port=3306
database.user=admin
database.password=123456

我们将解析这个配置文件,然后连接到数据库并执行一些操作。

javaCopy code
import java.io.*;
import java.util.*;
​
public class ConfigParser {
    private String host;
    private int port;
    private String user;
    private String password;
​
    public ConfigParser(String filePath) {
        try {
            parseConfig(filePath);
        } catch (IOException e) {
            System.err.println("无法读取配置文件:" + e.getMessage());
        }
    }
​
    private void parseConfig(String filePath) throws IOException {
        FileReader fileReader = new FileReader(filePath);
        StreamTokenizer tokenizer = new StreamTokenizer(fileReader);
        tokenizer.wordChars('.', '.'); // 允许点号在单词中出现
        tokenizer.parseNumbers(); // 允许解析数字
​
        Map<String, String> configMap = new HashMap<>();
​
        String key = null;
        String value = null;
        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
                key = tokenizer.sval;
            } else if (tokenizer.ttype == '=') {
                tokenizer.nextToken(); // 读取值
                value = tokenizer.sval;
                configMap.put(key, value);
            }
        }
​
        this.host = configMap.get("database.host");
        this.port = Integer.parseInt(configMap.get("database.port"));
        this.user = configMap.get("database.user");
        this.password = configMap.get("database.password");
    }
​
    public void connectToDatabase() {
        System.out.println("连接到数据库:");
        System.out.println("主机:" + host);
        System.out.println("端口:" + port);
        System.out.println("用户:" + user);
        System.out.println("密码:" + password);
        // 在此处执行数据库连接操作
    }
​
    public static void main(String[] args) {
        ConfigParser parser = new ConfigParser("config.txt");
        parser.connectToDatabase();
    }
}

在这个示例中,我们首先定义了一个 ConfigParser 类,它有一个构造方法,用于接收配置文件的路径并解析该文件。然后,我们使用 StreamTokenizer 解析配置文件,并将键值对存储在 configMap 中。最后,我们根据配置文件中的信息连接到数据库,并输出连接信息。

假设 config.txt 文件的内容如下:

Copy code
database.host=localhost
database.port=3306
database.user=admin
database.password=123456

当我们运行 main 方法时,将输出连接到数据库的相关信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux -- 线程概念和控制

一 什么是线程 1.1 线程的引出 我们开始理解一下Linux中的线程。我们以前说过&#xff0c;一个进程被创建出来&#xff0c;要有自己对应的进程PCB的&#xff0c;也就是 task_struct&#xff0c;也要有自己的地址空间、页表&#xff0c;经过页表映射到物理内存中。所以在进程角…

Docker:构建镜像,运行springboot项目、服务器开启虚拟内存

文章目录 构建镜像&#xff0c;运行项目开启虚拟内存构建&#xff0c;运行 构建镜像&#xff0c;运行项目 开启虚拟内存 我们自己购买服务器一般内存就2g&#xff0c;是不够用的&#xff0c;所以要开启虚拟内存。 创建目录 mkdir /file创建虚拟内存 dd if/dev/zero of/fi…

java数据结构与算法刷题-----LeetCode46. 全排列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力回溯2. 分区法回溯 1. 暴力回溯 解题思路&#xff1a;时…

ASP.NET-Server.HtmlEncode

目录 背景: 1.转义特殊字符&#xff1a; 2.防止跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; 3.确保输出安全性&#xff1a; 4.保留原始文本形式&#xff1a; 5.与用户输入交互安全&#xff1a; 实例说明: 不用Server.HtmlEncode 效果展示: 用Server.HtmlEnc…

蜘蛛矩阵系统:一个人如何运营上百个账号,方法在这里!

实体店若想在线上吸引客源&#xff0c;绝不能仅仅满足于拍摄几段短视频。现今的市场竞争已经迫使许多商家采用更先进的策略蜘蛛矩阵系统来进行获客。想象一下&#xff0c;你的竞争对手正在运用这一系统&#xff0c;他们开通有一百个账号&#xff0c;每天可以发布一百条的视频&a…

vue3 表单数据发生改变时,切换路由给我提示

一、需求说明 1、当表单数据未发生改变时&#xff0c;save和discard按钮不可点击&#xff0c;路由切换时无提示&#xff08;如下图所示&#xff09; 2、当表单数据发生改变时&#xff0c;save和discard按钮可点击&#xff0c;路由切换时出现提示&#xff08;如下图所示&#x…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句&#xff08;两种&#xff09; 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

西贝柳斯Sibelius2024免费专业的乐谱制作软件

西贝柳斯Sibelius是一款专业的乐谱制作软件&#xff0c;广泛应用于音乐教育、电影配乐、管弦乐团、合唱团等领域。以下是对Sibelius软件的详细介绍&#xff1a; sibelius2024版本下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid47077 一、功能 Sibelius具有强大…

Promise搞不懂,看这篇就明白了

Promise搞不懂&#xff0c;看这篇就明白了 Promise 是异步编程的一种解决方案&#xff0c;实质上Pomise是个对象&#xff0c;用来封装异步操作&#xff0c;可以更加优雅的书写复杂的异步任务。 具体来看他是怎么工作的&#xff1a; Promise语法格式 new Promise(function (re…

学习SSM的记录(八)-- SSM整合项目《任务列表案例》

前端程序搭建和运行 项目预览 接口分析 1.学习计划分页查询 需求&#xff1a;查询对应数据页数据 uri&#xff1a;schedule/{pageSize}/{currentPage} 请求方式&#xff1a;get 响应数据&#xff1a;json {"code":200,"flag":true,"data"…

基于java+springboot+vue实现的高校社团管理系统(文末源码+Lw+ppt)23-419

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

【C++算法模板】字典树,超详细注释带例题讲解

文章目录 0&#xff09;概述1&#xff09;数据结构2&#xff09;插入操作3&#xff09;查询操作4&#xff09;完整代码1. 字符数组2. 字符串 视频链接&#xff1a;F06 字典树(Trie) 0&#xff09;概述 是快速插入和查询字符串的多叉树结构&#xff0c;根节点编号为0&#xff0…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原&#xff0c;借助了第三方的工具&#xff0c;redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby&#xff1a; ruby下载地址&#xff1a;https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

Linux系统下基于VSCode和Cmake进行C++开发

目录 简介一、GCC编译器1.1创建cpp文件1.2编译过程1.3g重要编译参数 二、GDB调试器三、IDE-VScode3.1 VSCode常用快捷键3.2 swap测试 四、CMake4.1CMake介绍4.2 CMake语法特性介绍4.3 CMake重要指令和常用变量4.4 CMake编译流程4.5CMake代码实践 五、使用VSCode进行完整项目开发…

Gateway网关在url参数带有特殊字符的情况下转发失败(响应400)

本文主要分享了&#xff0c;SpringCloud Gateway网关在url参数带有空格或者特殊字符的情况下&#xff0c;转发失败导致响应错误码400的解决方案。 响应400错误码的2种场景&#xff1a; 1.参数带空格&#xff0c;Gateway会误认为该空格是切割符&#xff0c;如?phone 135****6…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统&#xff1a;病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今&#xff0c;大数据、云计算、移动…

深入浅出计算机网络 day.2 概论⑥ 计算机网络体系结构

上帝疯狂杜撰世界悲情的命题 将凉薄和荒芜尽写 —— 24.3.13 内容概述 1.常见的三种计算机网络体系结构 2.计算机网路体系结构分层的必要性 3.计算机网络体系结构分层思想举例 4.计算机网络体系结构中的专用术语 一、常见的三种计算机网络体系结构 1.OSI参考模型 …

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…

运行vue项目时的问题

1.问题:在终端输入:npm run serve时&#xff0c;弹出选择应用以打开npm 2.解决方法: 在你的终端中输入&#xff1a;get-command npm&#xff08;第一次可能没反应 再输入一次&#xff09; 根据这个路径找到npm删除即可 再次运行npm run serve

谈谈你对Java平台的理解?

从你接触 Java 开发到现在&#xff0c;你对 Java 最直观的印象是什么呢&#xff1f;是它宣传的 “Write once, run anywhere”&#xff0c;还是目前看已经有些过于形式主义的语法呢&#xff1f;你对于 Java 平台到底了解到什么程度&#xff1f;请你先停下来总结思考一下。 今天…