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;
}