All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jd.blockchain.utils.io.BytesInputStream Maven / Gradle / Ivy

The newest version!
package com.jd.blockchain.utils.io;

import java.io.IOException;
import java.io.InputStream;

public class BytesInputStream extends InputStream {

	private byte[] bytes;

	private int posistion;

	private int tail;

	public BytesInputStream(byte[] bytes, int offset, int size) {
		this.bytes = bytes;
		this.posistion = offset;
		this.tail = offset + size;
	}

	/**
	 * 当前读取位置;
* * 也是输入流的原始字节数组的位置; * * @return */ protected int getPosition() { return posistion; } /** * 当前输入流的原始字节数组; * @return */ protected byte[] getOriginBytes() { return bytes; } /** * 返回剩余的字节数; * * @return int */ public int getSize() { return tail - posistion; } /** * 读取接下来的 1 个字节并返回; * * @return byte */ public byte readByte() { int off = this.posistion; checkBoundary(off, 1); posistion++; return bytes[off]; } /** * 读取接下来的 2 个字节并返回16位字符; * * @return char */ public char readChar() { int off = posistion; checkBoundary(off, 2); char ch = BytesUtils.toChar(bytes, off); posistion += 2; return ch; } /** * 读取接下来的 2 个字节并返回16位整数; * * @return short */ public short readShort() { int off = posistion; checkBoundary(off, 2); short n = BytesUtils.toShort(bytes, off); posistion += 2; return n; } /** * 读取接下来的 4 个字节并返回32位整数; * * @return int */ public int readInt() { int off = posistion; checkBoundary(off, 4); int n = BytesUtils.toInt(bytes, off); posistion += 4; return n; } /** * 读取接下来的 8 个字节并返回64位整数; * * @return long */ public long readLong() { int off = posistion; checkBoundary(off, 8); long n = BytesUtils.toLong(bytes, off); posistion += 8; return n; } /** * 读取指定数量的字节并返回对应的字符串; * * @param size size * @return String */ public String readString(int size) { int off = posistion; checkBoundary(off, size); String s = BytesUtils.toString(bytes, off, size); posistion += size; return s; } /** * 读取指定数量的字节并返回对应的字符串; * * @param size size * @param charset charset * @return String */ public String readString(int size, String charset) { int off = posistion; checkBoundary(off, size); String s = BytesUtils.toString(bytes, off, size, charset); posistion += size; return s; } /** * 读取指定数量的字节并返回; * * @param size size * @return 返回指定数量的字节拷贝; */ public byte[] readBytes(int size) { byte[] copy = new byte[size]; readBytes(copy, 0, size); return copy; } public int readBytes(byte[] buffer, int offset, int size) { int off = posistion; int s = tail - posistion; s = s < size ? s : size; checkBoundary(off, s); System.arraycopy(bytes, off, buffer, offset, s); posistion += s; return s; } /** * 从当前位置开始读取, 返回剩余字节的片段;; 注:此操作不影响游标位置; * * @return BytesSlice */ public BytesSlice getSlice() { if (tail == posistion) { return BytesSlice.EMPTY; } return getSlice(tail - posistion); } /** * 从当前位置开始读取, 返回指定数量的字节片段; * *
* 注:此操作不影响游标位置; * * @param size size * @return byteSlice */ public BytesSlice getSlice(int size) { int off = posistion; checkBoundary(off, size); BytesSlice copy = new BytesSlice(bytes, off, size); return copy; } /** * 从当前位置开始读取, 返回指定数量的字节片段;
* * 注:此操作将数据游标位置向后移动指定数量的字节;; * * @param size size * @return byteSlice */ public BytesSlice readSlice(int size) { BytesSlice copy = getSlice(size); posistion += size; return copy; } public void skip(int size) { checkBoundary(posistion, size); posistion += size; } private void checkBoundary(int off, int len) { // assert off >= posistion && off + len <= tail : "The accessing index is out of // BytesInputStream's bounds!"; if (off < posistion || off + len > tail) { throw new IndexOutOfBoundsException("The accessing index is out of BytesInputStream's bounds!"); } } /** * 注:遵循 JDK 接口要求,读取一个字节以 int 类型返回; */ @Override public int read() throws IOException { return readByte() & 0xFF; } @Override public int read(byte[] b, int off, int len) throws IOException { return readBytes(b, off, len); } @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } @Override public int available() throws IOException { return getSize(); } @Override public long skip(long n) throws IOException { if (n < 0) { throw new IllegalArgumentException("Specified a negative number of bytes to be skipped!"); } if (n >= Integer.MAX_VALUE) { throw new IllegalArgumentException("The number of bytes to be skipped is out of max value!"); } skip((int) n); return n; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy