解析文本流是许多 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 应用程序中高效解析文本流打下了坚实的基础。请尝试使用这些示例,并根据您的特定用例对它们进行调整,以掌握流标记化的艺术。