Java中的StreamTokenizer

解析文本流是许多 Java 应用程序中的常见任务。Java 中的 StreamTokenizer 类提供了一种灵活有效的方法来将字符流分解为标记。在这篇博文中,我们将通过 10 个不同的代码示例探索“StreamTokenizer”的特性和功能。

示例 1:基本用法

import java.io.*;

public class Example1 {
    public static void main(String[] args) throws IOException {
        String input = "Hello World 123.45 true";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

解释:本例演示了使用 `StreamTokenizer` 对字符串进行标记的基本方法。它会打印每个标记,直到流结束。

例 2:自定义标记字符

import java.io.*;

public class Example2 {
    public static void main(String[] args) throws IOException {
        String input = "Name:John, Age:25, Gender:Male";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.wordChars(':', ':');
        tokenizer.wordChars(',', ',');

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

本例自定义了单词字符,允许标记包含冒号和逗号。它解析的是一个包含键值对的字符串。

例 3:处理数字

import java.io.*;

public class Example3 {
    public static void main(String[] args) throws IOException {
        String input = "42 3.14 -7.5";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
                System.out.println(
"Number: " + tokenizer.nval);
            }
        }
    }
}

解释:此示例主要处理数值。它识别并打印输入字符串中的数字标记。

例 4:处理带引号字符串

import java.io.*;

public class Example4 {
    public static void main(String[] args) throws IOException {
        String input = "\"Java Programming\" 'is fun'";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.quoteChar('
"');
        tokenizer.quoteChar('\'');

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
                System.out.println(
"String: " + tokenizer.sval);
            }
        }
    }
}

解释:该示例处理用双引号或单引号括起来的引号字符串,并打印每个字符串标记。

例 5:识别单词和空格

import java.io.*;

public class Example5 {
    public static void main(String[] args) throws IOException {
        String input = "Java   is    amazing";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.wordChars('a', 'z');
        tokenizer.whitespaceChars(' ', ' ');

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

说明此示例演示了识别特定单词字符和空白字符,生成有意义的标记。

例 6:处理评论

import java.io.*;

public class Example6 {
    public static void main(String[] args) throws IOException {
        String input = "/* This is a comment */ 42 // Another comment";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.slashStarComments(true);
        tokenizer.slashSlashComments(true);

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

解释:本示例同时处理块注释和行注释,在标记化过程中忽略它们。

例 7:处理 EOF

import java.io.*;

public class Example7 {
    public static void main(String[] args) throws IOException {
        String input = "Java is great";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

解释:此示例展示了如何在标记化过程中处理流结束 (EOF)。

例 8:忽略空格

import java.io.*;

public class Example8 {
    public static void main(String[] args) throws IOException {
        String input = "   Token1   Token2   ";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.whitespaceChars(' ', ' ');

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

说明本例演示了如何忽略标记中的前导和尾部空白。

例 9:处理普通字符

import java.io.*;

public class Example9 {
    public static void main(String[] args) throws IOException {
        String input = "Java@Programming";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        tokenizer.ordinaryChar('@');

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }
    }
}

解释:本例将"@"视为普通字符,将其视为标记的一部分。

例 10:重置令牌化

import java.io.*;

public class Example10 {
    public static void main(String[] args) throws IOException {
        String input = "Token1 Token2 Token3";
        StringReader reader = new StringReader(input);
        StreamTokenizer tokenizer = new StreamTokenizer(reader);

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Token: " + tokenizer.sval);
        }

       
// Reset the tokenizer for re-use
        tokenizer.resetSyntax();

        while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(
"Reused Token: " + tokenizer.sval);
        }
    }
}

解释:此示例展示了如何重置标记化器的状态以便重新使用,从而使其能够标记化新的输入流。

结论
在本综合指南中,我们通过 10 个不同的代码示例介绍了 Java 中`StreamTokenizer`类的各个方面。从基本用法到高级定制,您现在已经为在 Java 应用程序中高效解析文本流打下了坚实的基础。请尝试使用这些示例,并根据您的特定用例对它们进行调整,以掌握流标记化的艺术。