/* * class: EchoStrings * * Version $Id: EchoStrings.java 8584 2006-08-10 23:06:37Z duns $ * * Date: February 10 2003 * * (c) 2003 LBNL */ package org.freehep.record.loop.examples; import org.freehep.record.loop.LoopException; import org.freehep.record.loop.SequentialRecordLoop; import org.freehep.record.loop.SequentialRecordLoopImpl; import org.freehep.record.loop.event.RecordAdapter; import org.freehep.record.loop.event.RecordSuppliedEvent; import org.freehep.record.source.EndOfSourceException; import org.freehep.record.source.SequentialRecordSource; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.TooManyListenersException; /** This class gives the most basic example of how the {@link org.freehep.record.loop} package can be used. It implements, as a nested class, a <code>SequentialRecordSource</code> that reads a file and supplys each line read as a record. The class itself implements a <code>RecordListener</code> that prints the contents of each record, with which it is supplied, to the standard output. * * @version $Id: EchoStrings.java 8584 2006-08-10 23:06:37Z duns $ * @author patton */ public class EchoStrings extends RecordAdapter { // public static final member data // protected static final member data // static final member data // private static final member data // private static member data // private instance member data // constructors /** * Create an instance of this class. */ public EchoStrings() { } // instance member function (alphabetic) public void recordSupplied(RecordSuppliedEvent event) { String[] strings = ((StringsData) event.getRecord()).getStrings(); final int finished = strings.length; for (int string = 0; finished != string; string++) { System.out.println(strings[string]); } } // static member functions (alphabetic) /** * Class to hold line read in from file. */ public class StringsData { // private instance member data private String[] strings; /** * Create an instance of this class. * Default constructor is declared, but private, to stop accidental * creation of an instance of the class. */ private StringsData() { } /** * Create an instance of this class. */ public StringsData(String[] strings) { this.strings = strings; } /** * @return the strings which is in this object. */ public String[] getStrings() { return strings; } /** * @param strings the strings which is in this object. */ public void setStrings(String[] strings) { this.strings = strings; } } /** * Class to read in file line by line. */ public class LineSupplier implements SequentialRecordSource { // private instance member data private BufferedReader reader; private IOException ioException; private StringsData currentLine; /** * Create an instance of this class. * Default constructor is declared, but private, to stop accidental * creation of an instance of the class. */ private LineSupplier() { } /** * Create an instance of this class that will read the specified file. * * @param filename the name of the file to read. */ public LineSupplier(String filename) throws FileNotFoundException { reader = new BufferedReader(new FileReader(filename)); } public Object getCurrentRecord() throws EndOfSourceException, IOException { if (null != ioException) { throw ioException; } if (null == currentLine) { throw new EndOfSourceException("No more lines."); } return currentLine; } public long getEstimatedSize() { return -1; } public void next() { ioException = null; currentLine = null; String line = null; try { line = reader.readLine(); if (null == line) { return; } } catch (IOException e) { ioException = e; return; } currentLine = new StringsData(new String[]{line.trim()}); } public Class getRecordClass() { return StringsData.class; } public String getSourceName() { return getClass().getName(); } public void rewind() throws IOException { reader.reset(); } public void releaseRecord(Object record) { if (currentLine == record) { currentLine = null; } } public void close() throws IOException { reader.close(); } } // Description of this object. // public String toString() {} public static void main(String args[]) throws FileNotFoundException { // Check at least a filename is specified. if (0 == args.length) { System.err.println("Filename must be specified."); return; } // Create object which prints strings that are read in form a file. EchoStrings listener = new EchoStrings(); // Create object to read lines from a file. SequentialRecordSource supplier = listener. new LineSupplier(args[0]); // Create basic event loop SequentialRecordLoop recordLoop = new SequentialRecordLoopImpl(supplier); try { recordLoop.addRecordListener(listener); // Loop over the number of line requested or all of the file. long count; if (1 < args.length) { count = Integer.parseInt(args[1]); } else { count = -1; } long processed = recordLoop.loop(count); System.out.println("Processed " + processed + " lines."); } catch (TooManyListenersException e) { // Ignore as can not happen(!) } catch (LoopException e1) { System.err.println("Loop failed:\n" + e1.toString()); } catch (IOException e3) { System.err.println("An IOException was thrown."); } } }