import java.io.*; import java.util.*; /** * class for reading files and returning one word * from the file at a time using the Iterator idiom * * Usage: * * Iterator it = new WordIterator("filename.txt"); * while (it.hasNext()) * Process((String) it.next()); * * * @author $Author: ola $ * @version $Id: WordIterator.java,v 1.1 1999/10/13 06:18:06 ola Exp ola $ * @see Enumeration * * $Date: 1999/10/13 06:18:06 $ */ public class WordIterator implements Iterator { /** * opens file, readies for reading, re-throws failure to open * * @param filename the name of the file to get words from * */ public WordIterator(String filename) throws FileNotFoundException { this(new FileReader(filename)); } /** * read one word-at-a-time from a reader * @param r is reader bound to WordIterator * */ public WordIterator(Reader r) { myInput = new BufferedReader(r); myLineNumber = 0; getNextLine(); } private void getNextLine() { try { myWord = null; // default while ((myLine = myInput.readLine()) != null) { myLineNumber++; myTokenizer = new StringTokenizer(myLine, " \t\n\r"); if (myTokenizer.hasMoreTokens()) { myWord = myTokenizer.nextToken(); break; } } } catch (IOException e) { // what to do with an IOException?? myWord = null; } } /** * @return true if more words to be read, else false * */ public boolean hasNext() { return myWord != null; } /** * * @return next word (String) from input * * Note: user casts return type to string */ public Object next() { String word = myWord; if (myWord == null) { throw new NoSuchElementException("next() in WordIterator"); } if (! myTokenizer.hasMoreTokens()) { getNextLine(); } else { myWord = myTokenizer.nextToken(); } return word; } public void remove() { throw new UnsupportedOperationException("WordIterator does not remove"); } public static void main(String args[]) { if (args.length != 1) { System.out.println("usage: test "); } else { WordIterator wit = null; try{ wit = new WordIterator(args[0]); } catch (FileNotFoundException fnf){ System.out.println(fnf + " **ERROR opening " + args[0]); } while (wit.hasNext()) { System.out.println(wit.next()); } } } /** * @return current line number in file * */ public int getLineNumber() { return myLineNumber; } private BufferedReader myInput; private StringTokenizer myTokenizer; private String myWord; private String myLine; private int myLineNumber; }