62 lines
1.3 KiB
Java
62 lines
1.3 KiB
Java
package io.github.lonamiwebs.overgram.utils;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStreamReader;
|
|
import java.util.Iterator;
|
|
|
|
public class CharacterIterator implements Iterator<Character>, Iterable<Character>, 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<Character> 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;
|
|
}
|
|
}
|
|
}
|