package io.github.lonamiwebs.overgram.utils; import java.io.IOException; import java.io.InputStreamReader; import java.util.Iterator; public class CharacterIterator implements Iterator, Iterable, AutoCloseable { private static final int BUFFER_SIZE = 4096; private final InputStreamReader reader; private final char[] buffer; private int index; private int length; public CharacterIterator(final InputStreamReader reader) { this.reader = reader; buffer = new char[BUFFER_SIZE]; index = 0; readNext(); } @Override public Iterator iterator() { return this; } @Override public boolean hasNext() { if (index == BUFFER_SIZE) { readNext(); index = 0; } return index < length; } @Override public Character next() { if (index == BUFFER_SIZE) { readNext(); index = 0; } return buffer[index++]; } @Override public void close() { try { reader.close(); } catch (Exception ignored) { } } private void readNext() { try { length = reader.read(buffer); } catch (IOException ignored) { length = -1; } } }