概念
源碼說明:This abstract class is the superclass of all classes representing an input stream of bytes(個(gè)人理解為:定義輸入字節(jié)流的規(guī)范捣炬。即需要輸入字節(jié)流可按照這個(gè)規(guī)范實(shí)現(xiàn))
內(nèi)部結(jié)構(gòu)
- 讀取數(shù)據(jù)
- read():從輸入數(shù)據(jù)的流中獲取下一個(gè)字節(jié)數(shù)據(jù)(雖然返回int類型熊昌,但存儲(chǔ)范圍是0-255)。該方法將湿酸,直到可用輸入數(shù)據(jù)婿屹、檢測到文件結(jié)尾(返回-1)或引發(fā)異常為止。
- read(byte[]):從輸入流中讀取一定數(shù)量的字節(jié)推溃,并將其存儲(chǔ)到緩沖區(qū)數(shù)組中昂利。實(shí)際讀取的字節(jié)數(shù)以整數(shù)形式返回。該方法將铁坎,直到可用輸入數(shù)據(jù)蜂奸、檢測到文件結(jié)尾或引發(fā)異常為止。
- read(byte[], int, int):從輸入流中最多讀取n個(gè)字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組中硬萍。實(shí)際讀取的字節(jié)數(shù)以整數(shù)形式返回扩所。 此方法將,直到可用輸入數(shù)據(jù)襟铭、檢測到文件結(jié)尾或引發(fā)異常為止。
- 標(biāo)記數(shù)據(jù)(重讀數(shù)據(jù))
- markSupported():判斷當(dāng)前輸入流是否支持 mark和reset方法
- mark(int):標(biāo)記此輸入流中的當(dāng)前位置。后續(xù)調(diào)用reset 方法將從最后一個(gè)標(biāo)記位置開始讀取字節(jié)流寒砖。入?yún)⒈硎緲?biāo)記位置變?yōu)闊o效之前可以讀取的最大字節(jié)數(shù)限制
- reset():將此流重新定位到在此輸入流上最后一次調(diào)用mark 方法時(shí)的位置
- 其他
- shik(long):跳過并丟棄此輸入流中的n個(gè)字節(jié)的數(shù)據(jù)(跳過的數(shù)據(jù)還是可以通過mark與reset重新讀却土印)
- available():返回可以從此輸入流讀取(或跳過)而不會(huì)被該輸入流的方法的下一次調(diào)用的估計(jì)值
- close():關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源
接口實(shí)現(xiàn)
為了更好的理解InputStream接口哩都,咱們選擇一個(gè)具體實(shí)現(xiàn)來學(xué)習(xí)魁兼。這里咱們選擇java.io.ByteArrayInputStream
package java.io;
/**
* @author Arthur van Hoff
* @see java.io.StringBufferInputStream
* @since JDK1.0
*/
public class ByteArrayInputStream extends InputStream {
/**
* 存儲(chǔ)當(dāng)前流的所有流數(shù)據(jù),read操作即獲取數(shù)組中數(shù)據(jù)
*/
protected byte buf[];
/**
* 記錄下次read操作的數(shù)組(buf[])下標(biāo)值
*/
protected int pos;
/**
* 記錄當(dāng)前流被標(biāo)記的數(shù)組(buf[])下標(biāo)值漠嵌,通過mark方法設(shè)置咐汞,執(zhí)行reset方法時(shí)將pos設(shè)置為mark
*
* @since JDK1.1
*/
protected int mark = 0;
/**
* 記錄當(dāng)前流能被read的最大下標(biāo)值+1
*/
protected int count;
/**
* 構(gòu)造函數(shù)
*
* @param 當(dāng)前流的所有數(shù)據(jù)
*/
public ByteArrayInputStream(byte buf[]) {
this.buf = buf;
this.pos = 0;
this.count = buf.length;
}
/**
* 構(gòu)造函數(shù)
*
* @param buf 當(dāng)前流的所有數(shù)據(jù)
* @param offset 開始被read的數(shù)組下標(biāo)值
* @param length 允許被read的總字節(jié)數(shù)
*/
public ByteArrayInputStream(byte buf[], int offset, int length) {
this.buf = buf;
this.pos = offset;
this.count = Math.min(offset + length, buf.length);
this.mark = offset;
}
/**
* 獲取當(dāng)前流的下一個(gè)字節(jié)
*
* @return 讀取的字節(jié),如果超過最大運(yùn)行被讀的字節(jié)時(shí)則返回-1
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
/**
* 將當(dāng)前流中最多l(xiāng)en個(gè)字節(jié)數(shù)據(jù)讀取到一個(gè)字節(jié)數(shù)組中s
*
* @param b 存儲(chǔ)本次讀取的字節(jié)組
* @param off 目標(biāo)數(shù)組b開始存儲(chǔ)讀取字節(jié)數(shù)組的下標(biāo)值
* @param len 最大讀取字節(jié)數(shù)
* @return 總共讀取字節(jié)數(shù)儒鹿,如果到達(dá)流結(jié)尾則返回-1
*/
public synchronized int read(byte b[], int off, int len) {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
}
if (pos >= count) {
return -1;
}
int avail = count - pos;
if (len > avail) {
len = avail;
}
if (len <= 0) {
return 0;
}
System.arraycopy(buf, pos, b, off, len);
pos += len;
return len;
}
/**
* 跳過n個(gè)字節(jié)
*
* @param n 需要跳過的字節(jié)總數(shù)
* @return 實(shí)際跳過的字節(jié)總數(shù)
*/
public synchronized long skip(long n) {
long k = count - pos;
if (n < k) {
k = n < 0 ? 0 : n;
}
pos += k;
return k;
}
/**
* 返回可以從此輸入流讀然骸(或跳過)而不會(huì)阻塞的剩余字節(jié)數(shù)。
*
* @return 可以從此輸入流讀仍佳住(或跳過)而不會(huì)阻塞的剩余字節(jié)數(shù)
*/
public synchronized int available() {
return count - pos;
}
/**
* 判斷當(dāng)前輸入流是否支持 mark和reset方法(總是返回true)植阴。
*
* @since JDK1.1
*/
public boolean markSupported() {
return true;
}
/**
* 設(shè)置流中的當(dāng)前標(biāo)記位置
*
* 注意:此類的readAheadLimit沒有任何意義。
*
* @since JDK1.1
*/
public void mark(int readAheadLimit) {
mark = pos;
}
/**
* 將緩沖區(qū)重置到標(biāo)記的位置圾浅。除非在構(gòu)造函數(shù)中標(biāo)記了另一個(gè)位置或指定了偏移量掠手,否則標(biāo)記的位置為0。
*/
public synchronized void reset() {
pos = mark;
}
/**
* 關(guān)閉ByteArrayInputStream無效狸捕∨绺耄可以在關(guān)閉流之后調(diào)用此類中的方法,而不會(huì)生成IOException灸拍。
*/
public void close() throws IOException {
}
}