Java基礎(chǔ)知識(shí)之ByteArrayInputStream流的使用
Java ByteArrayInputStream流
一、ByteArrayInputStream流定義
API說明:ByteArrayInputStream包含一個(gè)內(nèi)部緩沖區(qū),其中包含可以從流中讀取的字節(jié),內(nèi)部計(jì)數(shù)器跟蹤read方法提供的下一個(gè)字節(jié),關(guān)閉ByteArrayInputStream流無效,關(guān)閉流后調(diào)用類的方法不會(huì)有異常產(chǎn)生
二、ByteArrayInputStream流實(shí)例域
/** * 字節(jié)數(shù)組緩沖區(qū),buf[0]到buf[count-1]是可以從流中讀取的字節(jié),buf[pos]是讀取的下一字節(jié) */ protected byte buf[]; /** *讀取字節(jié)的索引 */ protected int pos; /** * 流中當(dāng)前標(biāo)記的位置,默認(rèn)標(biāo)記為0,可以通過mark方法設(shè)置新的標(biāo)記點(diǎn),而后通過reset方法將當(dāng)前位置設(shè)置為標(biāo)記點(diǎn) * 從標(biāo)記點(diǎn)開始讀取數(shù)據(jù) * * @since JDK1.1 */ protected int mark = 0; /** * 索引結(jié)束位置+1,不大于緩沖區(qū)的長(zhǎng)度 */ protected int count;
三、ByteArrayInputStream流構(gòu)造函數(shù)
/** * 使用指定字節(jié)數(shù)組創(chuàng)建ByteArrayInputStream流,字節(jié)數(shù)組為流的緩沖區(qū), * 當(dāng)前位置索引pos初始值是0,索引結(jié)束位置count的是buf的長(zhǎng)度 */ public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } /** * 使用指定的數(shù)組創(chuàng)建ByteArrayInputStream流 * 目標(biāo)數(shù)組為流的緩沖區(qū)數(shù)組 * 緩沖區(qū)當(dāng)前起始位置變量值為off * 緩沖區(qū)的索引結(jié)束位置為:buf.length和off+length的最小值 */ 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; }
四、ByteArrayInputStream流方法
1)read()
:從此輸入流中讀取下一個(gè)字節(jié)并返回,當(dāng)流到達(dá)末尾時(shí),返回-1
/** * 從此輸入流中讀取下一個(gè)字節(jié)并返回 * 當(dāng)流到達(dá)末尾時(shí),返回-1 * 注意& 0xff是字節(jié)的補(bǔ)碼操作,暫時(shí)不用理會(huì) */ public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; }
2)read(byte b[], int off, int len)
:從輸入流中讀取最多l(xiāng)en個(gè)字節(jié)到目標(biāo)數(shù)組中,返回實(shí)際讀取的字節(jié)數(shù)
/** * 從輸入流中讀取最多l(xiāng)en個(gè)字節(jié)到目標(biāo)數(shù)組中,返回實(shí)際讀取的字節(jié)數(shù) * 當(dāng)緩沖區(qū)中剩余字符數(shù)小于len個(gè)字節(jié)時(shí),讀取緩沖區(qū)剩余字符數(shù) * 當(dāng)剩余字符數(shù)大于len個(gè)字節(jié)時(shí),讀取len個(gè)字節(jié) */ 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; }
3)close()
:關(guān)閉流無效,關(guān)閉后調(diào)用其它方法不會(huì)有異常
/** * 關(guān)閉流無效,關(guān)閉后調(diào)用其它方法不會(huì)有異常 */ public void close() throws IOException { }
五、ByteArrayInputStream流的作用
暫時(shí)不理解具體作用,不清楚什么時(shí)候會(huì)用到該流,因?yàn)閷?shí)際項(xiàng)目暫未用到,故先了解其功能即可
六、ByteArrayInputStream的用法解析
看下面這個(gè)程序,看懂了就會(huì)了
import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; public class Test4 { //ByteArrayInputStream本身操作的是一個(gè)數(shù)組,并沒有打開文件描述之類的,所有不需要關(guān)閉流 public static void main(String[] args) { ByteArrayInputStream bais=null; StringBuilder sb=new StringBuilder(); int temp=0; int num=0; long date1=System.currentTimeMillis(); try{ byte[] b="abcdefghijklmnopqstuvxyz".getBytes(); //從字符數(shù)組b中讀取數(shù)據(jù),從下標(biāo)為2開始計(jì)數(shù)讀8個(gè) bais=new ByteArrayInputStream(b,2,8); while((temp=bais.read())!=-1){ sb.append((char)temp); num++; } System.out.println(sb); System.out.println("讀取的字節(jié)數(shù):"+num); }finally{ try{ bais.close();//不需要關(guān)閉流的,但是調(diào)用close沒有任何影響,close不做任何事情 }catch(IOException e){ e.printStackTrace(); } new File("d:"+File.separator+"a.txt");//File.separator是一個(gè)文件分隔符,在windows和linux平臺(tái)下運(yùn)行都沒有問題 } long date2=System.currentTimeMillis(); System.out.println("耗時(shí):"+(date2-date1)); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java延時(shí)執(zhí)行的三種實(shí)現(xiàn)方式
本文主要介紹了Java延時(shí)執(zhí)行的三種實(shí)現(xiàn)方式,主要包括了Thread.sleep()方法,.sleep()使用Timer類或使用ScheduledExecutorService接口,感興趣的可以了解一下2023-12-12用java生成html文件實(shí)現(xiàn)原理及代碼
用printStream來向html文件里輸出數(shù)據(jù),先創(chuàng)建一個(gè)StringBuilder對(duì)象,通過append方法來為其添加html語句,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08自制Java工具實(shí)現(xiàn)翻譯鼠標(biāo)選中文本
這篇文章主要為大家詳細(xì)介紹了如何自制Java工具實(shí)現(xiàn)ctrl+c+c翻譯鼠標(biāo)選中文本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講
這篇文章主要為大家介紹了Spring?Lifecycle和SmartLifecycle的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10啟動(dòng)Tomcat時(shí)出現(xiàn)大量亂碼的解決方法
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著啟動(dòng)Tomcat時(shí)出現(xiàn)大量亂碼的解決方法展開,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下2021-06-06淺談java二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換
下面小編就為大家?guī)硪黄獪\談二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2016-06-06Java lambda list轉(zhuǎn)換map時(shí),把多個(gè)參數(shù)拼接作為key操作
這篇文章主要介紹了Java lambda list轉(zhuǎn)換map時(shí),把多個(gè)參數(shù)拼接作為key操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08貨拉拉大數(shù)據(jù)對(duì)BitMap的探索實(shí)踐詳解
這篇文章主要為大家介紹了貨拉拉大數(shù)據(jù)對(duì)BitMap的探索實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09