Class DefaultByteInput
java.lang.Object
cool.scx.io.DefaultByteInput
- All Implemented Interfaces:
ByteInput, AutoCloseable
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classprotected static final record -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final ByteSupplierprotected booleanprotected DefaultByteInput.ByteChunkNodeprotected DefaultByteInput.ByteChunkNode -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected voidappendByteChunk(ByteChunk byteChunk) voidclose()关闭这个流, 此方法应该是幂等的.protected long确保 有数据可用 (至少 1 字节)protected void确保 openindexOf(ByteIndexer indexer, long maxLength) 在最多 maxLength 个字节中查找匹配 (或直到 EOF).protected ByteMatchResultindexOf0(ByteIndexer indexer, long maxLength, long maxPullCount) booleanisClosed()检测当前流是否关闭mark()在当前读取位置创建一个标记对象.bytepeek()查看字节, 行为参考ByteInput.read()<X extends Throwable>
voidpeek(ByteConsumer<X> byteConsumer, long maxLength) 查看字节, 行为参考ByteInput.read(ByteConsumer, long)<X extends Throwable>
voidpeekFully(ByteConsumer<X> byteConsumer, long length) 查看字节, 行为参考ByteInput.readFully(ByteConsumer, long)<X extends Throwable>
voidpeekUpTo(ByteConsumer<X> byteConsumer, long length) 查看字节, 行为参考ByteInput.readUpTo(ByteConsumer, long)protected boolean从 byteSupplier 中持续拉取直到得到有效数据块byteread()读取单个字节<X extends Throwable>
voidread(ByteConsumer<X> byteConsumer, long maxLength) 最多读取 maxLength 个字节, 可能少于 maxLength (即使尚未遇到 EOF, 如底层缓冲区不足)protected <X extends Throwable>
voidread0(ByteConsumer<X> consumer, long maxLength, boolean movePointer, long maxPullCount, boolean throwOnEOF) 底层 的 read<X extends Throwable>
voidreadFully(ByteConsumer<X> byteConsumer, long length) 恰好读取 length 个字节<X extends Throwable>
voidreadUpTo(ByteConsumer<X> byteConsumer, long length) 尽量读取 length 个字节, 可能少于 length (仅在 EOF 时发生)Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface ByteInput
indexOf, indexOf, indexOf, indexOf, indexOf, peek, peekAll, peekAll, peekFully, peekUntil, peekUntil, peekUntil, peekUntil, peekUntil, peekUntil, peekUpTo, read, readAll, readAll, readFully, readUntil, readUntil, readUntil, readUntil, readUntil, readUntil, readUpTo, skip, skipAll, skipFully, skipUpTo
-
Field Details
-
byteSupplier
-
head
-
tail
-
closed
protected volatile boolean closed
-
-
Constructor Details
-
DefaultByteInput
-
-
Method Details
-
appendByteChunk
-
pullByteChunk
从 byteSupplier 中持续拉取直到得到有效数据块- Returns:
- EOF
- Throws:
ScxIOException
-
ensureOpen
-
ensureAvailable
确保 有数据可用 (至少 1 字节)- Returns:
- 调用了几次底层拉取
- Throws:
ScxIOExceptionNoMoreDataException
-
read0
protected <X extends Throwable> void read0(ByteConsumer<X> consumer, long maxLength, boolean movePointer, long maxPullCount, boolean throwOnEOF) throws X, ScxIOException, NoMoreDataException 底层 的 read- Type Parameters:
X- 用户自定义异常- Parameters:
consumer- 字节消费者maxLength- 希望读取的字节数movePointer- 是否移动指针maxPullCount- 最大允许调用底层 ByteSupplier 的次数throwOnEOF- 当遇到 EOF (底层数据源结束), 导致实际读取字节数不足时 是否抛异常- Throws:
X- XScxIOExceptionNoMoreDataException
-
indexOf0
protected ByteMatchResult indexOf0(ByteIndexer indexer, long maxLength, long maxPullCount) throws NoMatchFoundException, ScxIOException - Throws:
NoMatchFoundExceptionScxIOException
-
read
Description copied from interface:ByteInput读取单个字节
- 如果 当前没有数据可读 (立即遇到 EOF), 则会抛出 NoMoreDataException
- Specified by:
readin interfaceByteInput- Throws:
ScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
read
public <X extends Throwable> void read(ByteConsumer<X> byteConsumer, long maxLength) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput最多读取 maxLength 个字节, 可能少于 maxLength (即使尚未遇到 EOF, 如底层缓冲区不足)
- 如果 maxLength = 0, 立即返回 (不抛出异常, 即使在 EOF 状态)
- 如果 maxLength > 0, 至少读取 1 个字节.
- 如果 数据不足 (读取过程中遇到 EOF), 则停止读取
- 如果 当前没有数据可读 (立即遇到 EOF), 则会抛出 NoMoreDataException
- Specified by:
readin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
readUpTo
public <X extends Throwable> void readUpTo(ByteConsumer<X> byteConsumer, long length) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput尽量读取 length 个字节, 可能少于 length (仅在 EOF 时发生)
- 如果 length = 0, 立即返回 (不抛出异常, 即使在 EOF 状态)
- 如果 length > 0, 至少读取 1 个字节.
- 如果 数据不足 (读取过程中遇到 EOF), 则停止读取
- 如果 当前没有数据可读 (立即遇到 EOF), 则会抛出 NoMoreDataException
- Specified by:
readUpToin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
readFully
public <X extends Throwable> void readFully(ByteConsumer<X> byteConsumer, long length) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput恰好读取 length 个字节
- 如果 length = 0, 立即返回且不抛出异常 (即使在 EOF 状态)
- 如果 length > 0. 一定读取 length 个字节.
- 如果 数据不足 (读取过程中遇到 EOF), 则会抛出 NoMoreDataException
- 如果 当前没有数据可读 (立即遇到 EOF), 则会抛出 NoMoreDataException
- Specified by:
readFullyin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
peek
Description copied from interface:ByteInput查看字节, 行为参考ByteInput.read()- Specified by:
peekin interfaceByteInput- Throws:
ScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
peek
public <X extends Throwable> void peek(ByteConsumer<X> byteConsumer, long maxLength) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput查看字节, 行为参考ByteInput.read(ByteConsumer, long)- Specified by:
peekin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
peekUpTo
public <X extends Throwable> void peekUpTo(ByteConsumer<X> byteConsumer, long length) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput查看字节, 行为参考ByteInput.readUpTo(ByteConsumer, long)- Specified by:
peekUpToin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
peekFully
public <X extends Throwable> void peekFully(ByteConsumer<X> byteConsumer, long length) throws X, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput查看字节, 行为参考ByteInput.readFully(ByteConsumer, long)- Specified by:
peekFullyin interfaceByteInput- Throws:
XScxIOExceptionAlreadyClosedExceptionNoMoreDataException
-
indexOf
public ByteMatchResult indexOf(ByteIndexer indexer, long maxLength) throws NoMatchFoundException, ScxIOException, AlreadyClosedException, NoMoreDataException Description copied from interface:ByteInput在最多 maxLength 个字节中查找匹配 (或直到 EOF).
- 如果 indexer 是 空匹配模式. (意味着没有消费数据的能力和意义)
- 在任意情况下都返回 0. (恒为 0)
- 如果 indexer 不是 空匹配模式.
- 如果 maxLength = 0, 抛 NoMatchFoundException (恒 NoMatch, 因为这是不可能完成的任务).
- 如果 maxLength > 0. (正常逻辑)
- 如果在边界达成条件内仍未匹配到 (如达到 maxLength限制 或 读取过程中遇到 EOF) 抛出 NoMatchFoundException.
- 如果 当前没有数据可读 (立即遇到 EOF), 则会抛出 NoMoreDataException.
- Specified by:
indexOfin interfaceByteInput- Throws:
NoMatchFoundExceptionScxIOExceptionAlreadyClosedExceptionNoMoreDataException
- 如果 indexer 是 空匹配模式. (意味着没有消费数据的能力和意义)
-
mark
Description copied from interface:ByteInput在当前读取位置创建一个标记对象.- Specified by:
markin interfaceByteInput- Throws:
AlreadyClosedException
-
isClosed
-
close
Description copied from interface:ByteInput关闭这个流, 此方法应该是幂等的.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceByteInput- Throws:
ScxIOException
-