StreamTokenizer详解

一、StreamTokenizer概述

Java中的StreamTokenizer类是用于解析输入流的一个强大工具,可以按照不同的标记对输入进行解析,并将其分类。

StreamTokenizer用于将字节流转换为字符流并对其进行分词,可以识别各种类型的标记,如字符串、整数和浮点数。

StreamTokenizer是一种高效的解析工具,适用于解析文本文件、配置文件等一般应用场景。它比Scanner类更加高效,因为它不需要进行正则表达式的匹配。

二、StreamTokenizer主要方法

1.nextToken()

nextToken()方法用来获取下一个标记,它返回一个整型值,表示下一个标记的类型,常见的标记类型包括:

  1. TT_EOF:表示已到达输入流的末尾
  2. TT_NUMBER:表示下一个标记是一个数字,可以使用nval属性来获取该数字的值
  3. TT_WORD:表示下一个标记是一个字符串,可以使用sval属性来获取该字符串的值
  4. 单个字符表示该字符的ASCII码值
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
        System.out.println("Number: " + tokenizer.nval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        System.out.println("String: " + tokenizer.sval);
    } else {
        System.out.println("Char: " + (char) tokenizer.ttype);
    }
}

2.parseNumbers(boolean flag)

parseNumbers()方法用来设置tokenizer是否要解析数字,默认情况下是不解析数字的。

如果flag为true,则tokenizer会将所有数字作为标记来处理。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.parseNumbers(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
        System.out.println("Number: " + tokenizer.nval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        System.out.println("String: " + tokenizer.sval);
    } else {
        System.out.println("Char: " + (char) tokenizer.ttype);
    }
}

3.eolIsSignificant(boolean flag)

eolIsSignificant()方法用来设置tokenizer是否将行结束符作为标记,如果flag为true,则行结束符会被视为单独的标记,而不是字符串的一部分。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.eolIsSignificant(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
        System.out.println("Number: " + tokenizer.nval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        System.out.println("String: " + tokenizer.sval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
        System.out.println("End of line");
    } else {
        System.out.println("Char: " + (char) tokenizer.ttype);
    }
}

4.quoteChar(int ch)

quoteChar()方法用来设置tokenizer识别某个字符作为引号。当tokenizer遇到被设置的引号时,它会将引号内的所有字符作为一个标记。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
        System.out.println("Number: " + tokenizer.nval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        System.out.println("String: " + tokenizer.sval);
    } else {
        System.out.println("Char: " + (char) tokenizer.ttype);
    }
}

三、StreamTokenizer应用场景

1.解析CSV文件

CSV文件是一种常见的表格数据存储格式,它使用逗号分隔列数据,并使用回车换行符作为行分隔符。

StreamTokenizer可以轻松解析CSV文件,并将每一列数据作为一个标记返回。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.csv"));
tokenizer.eolIsSignificant(true);
tokenizer.wordChars(',', ',');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
        System.out.println("Number: " + tokenizer.nval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        System.out.println("String: " + tokenizer.sval);
    } else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
        System.out.println("End of line");
    }
}

2.解析INI文件

INI文件是一种常见的配置文件格式,它使用键值对的方式存储数据。

StreamTokenizer可以轻松解析INI文件,并将每个键值对作为一个标记返回。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.ini"));
tokenizer.wordChars('_', '_');
tokenizer.wordChars('-', '-');
tokenizer.quoteChar('"');
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);
        }
    }
}

3.解析XML文件

XML文件是一种常见的标记语言,用于描述和存储数据。

StreamTokenizer可以简单地解析XML文件,并将每个标记作为一个标记返回,并且可以使用递归函数进行解析内部元素。

StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.xml"));
tokenizer.wordChars(':', ':');
tokenizer.wordChars('_', '_');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
        String tag = tokenizer.sval;
        System.out.println("");

        if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == StreamTokenizer.TT_WORD) {
            System.out.println(tokenizer.sval);
        }

        if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == '/') {
            System.out.println("");
        } else {
            tokenizer.pushBack();
            parseXMLElement(tokenizer);
        }
    }
}

public static void parseXMLElement(StreamTokenizer tokenizer) throws IOException {
    while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
        if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
            String attribute = tokenizer.sval;
            tokenizer.nextToken();
            String value = tokenizer.sval;
            System.out.println(attribute + " = " + value);
        } else if (tokenizer.ttype == StreamTokenizer.TT_SLASH) {
            break;
        }
    }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304215.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-01 11:04
下一篇 2025-01-01 11:04

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论