package org.jical; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import java.util.ArrayList; public class LineIterator implements Iterator { private BufferedReader m_reader; private List m_lines = new ArrayList(); public LineIterator( InputStream stream ) { this( new InputStreamReader( stream ) ); } public LineIterator( InputStream stream, String enc ) throws UnsupportedEncodingException { this( new InputStreamReader( stream, enc ) ); } public LineIterator( Reader reader ) { if ( reader instanceof BufferedReader ) { m_reader = (BufferedReader) reader; } else { m_reader = new BufferedReader( reader ); } } public boolean hasNext() { checkLines(); return ( !m_lines.isEmpty() ); } public Object next() { if ( hasNext() ) { return m_lines.remove( 0 ); } return null; } public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } private void checkLines() { synchronized ( m_lines ) { if ( (m_lines.size()) < 1 && (m_reader != null) ) { try { String line = m_reader.readLine(); if ( line != null ) { m_lines.add( new StringBuffer( line ) ); checkLines(); } else { m_reader.close(); m_reader = null; } } catch ( IOException ex ) { ex.printStackTrace(); } } } } }