在具有多行的文本文件上使用StringTokenizer时出错

我正在尝试读取文本文件并使用java中的字符串标记生成器实用程序单独拆分单词。

文本文件看起来像这样;

a 2000 4 b 3000 c 4000 d 5000 

现在,我要做的是从文本文件中获取每个单独的字符并将其存储到数组列表中。 然后我尝试打印arraylist中的每个元素。

这是我的代码;

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; public static void main(String[] args) { String fileSpecified = args[0]; fileSpecified = fileSpecified.concat(".txt"); String line; System.out.println ("file Specified = " + fileSpecified); ArrayList  words = new ArrayList (); try { FileReader fr = new FileReader (fileSpecified); BufferedReader br = new BufferedReader (fr); line = br.readLine(); StringTokenizer token; while ((line = br.readLine()) != null) { token = new StringTokenizer (line); words.add(token.nextToken()); } } catch (IOException e) { System.out.println (e.getMessage()); } for (int i = 0; i < words.size(); i++) { System.out.println ("words = " + words.get(i)); } } 

我得到的错误信息是这样的;

 Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken at getWords.main 

其中’getWords’是我的java文件的名称。

谢谢。

a)您必须首先检查StringTokenizer.hasMoreTokens() 。 如果没有更多令牌可用,则抛出NoSuchElementException是记录的行为:

 token = new StringTokenizer (line); while(token.hasMoreTokens()) words.add(token.nextToken()); 

b)不要为每一行创建一个新的Tokenizer,除非你的文件太大而无法放入内存。 将整个文件读取到String并让tokenizer处理它

您的一般方法似乎很合理,但您的代码中存在基本问题。

您的解析器很可能在输入文件的第二行失败。 这一行是一个空行,所以当你调用words.add(token.nextToken()); 你得到一个错误,因为没有令牌。 这也意味着你只能获得每一行的第一个令牌。

你应该像这样迭代tokes:

 while(token.hasMoreTokens()) { words.add(token.nextToken()) } 

你可以在这里的javadocs中找到一个更一般的例子:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html

此问题是由于您在尝试获取下一个令牌之前未测试是否存在下一个令牌。 在调用nextToken()之前,您应该始终测试hasMoreTokens()之前是否返回true

但你有其他的错误:

  • 第一行是读取的,但不是标记化的
  • 您只需将每行的第一个单词添加到单词列表中
  • 不好的做法:令牌变量应该在循环内声明,而不是在外面
  • 你不要在finally块中关闭你的读者

您需要使用hasMoreTokens()方法。 还解决了JB Nizet指出的代码中的各种编码标准问题

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; public class TestStringTokenizer { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { String fileSpecified = args[0]; fileSpecified = fileSpecified.concat(".txt"); String line; System.out.println ("file Specified = " + fileSpecified); ArrayList  words = new ArrayList (); BufferedReader br = new BufferedReader (new FileReader (fileSpecified)); try{ while ((line = br.readLine()) != null) { StringTokenizer token = new StringTokenizer (line); while(token.hasMoreTokens()) words.add(token.nextToken()); } } catch (IOException e) { System.out.println (e.getMessage()); e.printStackTrace(); } finally { br.close(); } for (int i = 0; i < words.size(); i++) { System.out.println ("words = " + words.get(i)); } } }