我正在使用Buffered Reader将文件的各行传递给Java的StringTokenizer
。该文件的结构如下:
"2,0";"foo";"foo.doc";"12345"
"2,4";"foo";"foo.doc";"34567";"foo7";"foo7.doc";"45678";"foo6";"foo6.doc";"56789";"foo5";"foo5.doc";"67890";"foo4";"foo4.doc";"23456"
"3,0";"foo7";"foo7.doc";"34567"
"3,0";"foo6";"foo6.doc";"45678"
"3,0";"foo5";"foo5.doc";"56789"
"3,0";"foo4";"foo4.doc";"67890"
这是我正在使用的代码。
public class parse {
public static void main(String args[]) {
FileInputStream inputStream = new FileInputStream("whidata0.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while((scrubbedInput=br.readLine())!=null) {
StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
int tokens = strTok.countTokens();
while (strTok.hasMoreTokens()) {
tok01 = strTok.nextToken();
}
System.out.println(" scrubbed: " + scrubbedInput);
System.out.println(" tokens: " + tokens);
System.out.println(" tok01: " + tok01);
}
}
}
产生这个结果。
scrubbed: "2,0";"foo";"foo.doc";"12345"
tokens: 4
tok01: 12345 scrubbed: "2,4";"foo";"foo.doc";"34567";"foo7";"foo7.doc";"45678";"foo6";"foo6.doc";"56789";"foo5";"foo5.doc";"67890";"foo4";"foo4.doc";"23456"
tokens: 16
tok01: 23456
scrubbed: "3,0";"foo7";"foo7.doc";"34567"
tokens: 4
tok01: 34567
scrubbed: "3,0";"foo6";"foo6.doc";"45678"
tokens: 4
tok01: 45678
scrubbed: "3,0";"foo5";"foo5.doc";"56789"
tokens: 4
tok01: 56789
scrubbed: "3,0";"foo4";"foo4.doc";"67890"
tokens: 4
tok01: 67890
使用nextToken()
时应该是什么起始标记?似乎StringTokenizer
以令牌0
开头,因此nextToken()
实际上是令牌1
- 第二个物理令牌。我没有在Java文档中看到firstToken()
方法,也没有看到将特定标记分配给特定变量的方法(例如,String myToken = strTok.tokenNumber(0)
等)。访问String中的第一个物理标记需要做什么?
答案 0 :(得分:5)
您的代码不反映输出,但是当您想要访问任意令牌时,无论如何您可能想要使用String.split()
函数而不是标记器,例如:
String st = "a;b;c";
String[] tokens = st.split(";");
System.out.println(tokens[0]);
将打印出“a”,第一个标记。
StringTokenizer
类只允许在令牌之后访问令牌,您无法以随机访问方式访问令牌。但您也可以使用它来访问第一个令牌:
String st = "a;b;c";
StringTokenizer tokenizer = new StringTokenizer(st,";");
System.out.println(tokenizer.nextToken());
还会打印出“a”,第一个标记。
答案 1 :(得分:0)
您在循环中覆盖tokens
的值。
试试这个并查看输出。
public class parse {
public static void main(String args[]) {
FileInputStream inputStream = new FileInputStream("whidata0.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while((scrubbedInput=br.readLine())!=null) {
StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
int tokens = strTok.countTokens();
while (strTok.hasMoreTokens()) {
tok01 = strTok.nextToken();
System.out.println(" tok01: " + tok01);
}
System.out.println(" scrubbed: " + scrubbedInput);
System.out.println(" tokens: " + tokens);
System.out.println("last tok01: " + tok01);
}
}
}
答案 2 :(得分:0)
这里的问题是你打出System.out.println(" tok01: " + tok01);
的while循环
StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
int tokens = strTok.countTokens();
while (strTok.hasMoreTokens()) {
tok01 = strTok.nextToken();// here is the problem
}
System.out.println(" scrubbed: " + scrubbedInput);
System.out.println(" tokens: " + tokens);
System.out.println(" tok01: " + tok01);
我认为应该如下所示
StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
int tokens = strTok.countTokens();
System.out.println(" scrubbed: " + scrubbedInput);
System.out.println(" tokens: " + tokens);
while (strTok.hasMoreTokens()) {
tok01 = strTok.nextToken();
System.out.println(" tok01: " + tok01);
}
答案 3 :(得分:-1)
你的while循环首先遍历所有标记,我认为这是一个错位的}
。
while (strTok.hasMoreTokens()) {
tok01 = strTok.nextToken();
System.out.println(" tok01: " + tok01);
}