Use an iterator . Implementation Sketch:
class ReaderIterator implements Iterator<Character> { private final Reader reader; private int next = -1; public ReaderIterator(Reader reader) { this.reader = reader; } @Override public boolean hasNext() { if (next != -1) { return true; } else { try { next = reader.read(); return (next != -1); } catch (IOException e) { throw new ReadException(e); } } } @Override public Character next() { if (!hasNext()) { throw new NoSuchElementException(); } Character result = Character.valueOf((char)next); next = -1; return result; } }
Then pass the iterator to the parser:
fileRead = new BufferedReader(new FileReader(pathFile)); ReaderIterator iterator = new ReaderIterator(fileRead); parser.Parse(iterator); // Parse(Iterator<Character> iterator)
In the parser we get the characters:
while (iterator.hasNext()) { char c = iterator.next().charValue(); // ... }
The disadvantage of the solution is that ReadException must be unchecked.