summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java115
1 files changed, 17 insertions, 98 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java b/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java
index fed74fe..f019e09 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java
@@ -1,95 +1,37 @@
package bjc.utils.ioutils;
-import java.io.LineNumberReader;
-import java.io.Reader;
+import java.io.IOException;
import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Scanner;
import java.util.function.Consumer;
-import java.util.regex.Pattern;
/**
- * Implements reading numbered blocks from a source.
+ * A source of blocks of characters, marked with line numbers as to block
+ * start/block end.
*
- * A block is a series of characters, separated by some regular expression.
- *
- * NOTE: The EOF marker is always treated as a delimiter. You are expected to
- * handle blocks that may be shorter than you expect.
- *
- * @author EVE
+ * @author bjculkin
*
*/
-public class BlockReader implements AutoCloseable, Iterator<Block> {
- /*
- * I/O source for blocks.
- */
- private LineNumberReader lnReader;
- private Scanner blockReader;
-
- /*
- * The current block.
- */
- private Block currBlock;
- private int blockNo;
-
- /**
- * Create a new block reader.
- *
- * @param blockDelim
- * The pattern that separates blocks. Note that the end
- * of file is always considered to end a block.
- *
- * @param source
- * The source to read blocks from.
- */
- public BlockReader(String blockDelim, Reader source) {
- lnReader = new LineNumberReader(source);
-
- blockReader = new Scanner(lnReader);
-
- String pattern = String.format("(?:%s)|\\Z", blockDelim);
- Pattern pt = Pattern.compile(pattern, Pattern.MULTILINE);
-
- blockReader.useDelimiter(pt);
- }
-
+public interface BlockReader extends AutoCloseable, Iterator<Block> {
/**
* Check if this reader has an available block.
*
* @return Whether or not another block is available.
*/
- public boolean hasNextBlock() {
- return blockReader.hasNext();
- }
+ boolean hasNextBlock();
/**
* Get the current block.
*
* @return The current block, or null if there is no current block.
*/
- public Block getBlock() {
- return currBlock;
- }
+ Block getBlock();
/**
* Move to the next block.
*
* @return Whether or not the next block was successfully read.
*/
- public boolean nextBlock() {
- try {
- int blockStartLine = lnReader.getLineNumber();
- String blockContents = blockReader.next();
- int blockEndLine = lnReader.getLineNumber();
- blockNo += 1;
-
- currBlock = new Block(blockNo, blockContents, blockStartLine, blockEndLine);
-
- return true;
- } catch (NoSuchElementException nseex) {
- return false;
- }
- }
+ boolean nextBlock();
/**
* Execute an action for each remaining block.
@@ -97,11 +39,9 @@ public class BlockReader implements AutoCloseable, Iterator<Block> {
* @param action
* The action to execute for each block
*/
- public void forEachBlock(Consumer<Block> action) {
- while (hasNextBlock()) {
- nextBlock();
-
- action.accept(currBlock);
+ default void forEachBlock(Consumer<Block> action) {
+ while (hasNext()) {
+ action.accept(next());
}
}
@@ -110,40 +50,19 @@ public class BlockReader implements AutoCloseable, Iterator<Block> {
*
* @return The number of blocks read so far.
*/
- public int getBlockCount() {
- return blockNo;
- }
-
- @Override
- public void close() throws Exception {
- blockReader.close();
-
- lnReader.close();
- }
-
- /**
- * Set the delimiter used to separate blocks.
- *
- * @param delim
- * The delimiter used to separate blocks.
- */
- public void setDelimiter(String delim) {
- blockReader.useDelimiter(delim);
- }
+ int getBlockCount();
- /*
- * Iterator implementation.
- */
+ void close() throws IOException;
@Override
- public boolean hasNext() {
- return blockReader.hasNext();
+ default boolean hasNext() {
+ return hasNextBlock();
}
@Override
- public Block next() {
+ default Block next() {
nextBlock();
return getBlock();
}
-}
+} \ No newline at end of file