官术网_书友最值得收藏!

2.1.1 讀寫字節(jié)

InputStream類有一個(gè)抽象方法:

這個(gè)方法將讀入一個(gè)字節(jié),并返回讀入的字節(jié),或者在遇到輸入源結(jié)尾時(shí)返回-1。在設(shè)計(jì)具體的輸入流類時(shí),必須覆蓋這個(gè)方法以提供適用的功能,例如,在FileInputStream類中,這個(gè)方法將從某個(gè)文件中讀入一個(gè)字節(jié),而System.in(它是InputStream的一個(gè)子類的預(yù)定義對象)卻是從“標(biāo)準(zhǔn)輸入”中讀入信息,即控制臺(tái)或重定向的文件。

InputStream類還有若干個(gè)非抽象的方法,它們可以讀入一個(gè)字節(jié)數(shù)組,或者跳過大量的字節(jié)。這些方法都要調(diào)用抽象的read方法,因此,各個(gè)子類都只需覆蓋這一個(gè)方法。

與此類似,OutputStream類定義了下面的抽象方法:

它可以向某個(gè)輸出位置寫出一個(gè)字節(jié)。

read和write方法在執(zhí)行時(shí)都將阻塞,直至字節(jié)確實(shí)被讀入或?qū)懗觥_@就意味著如果流不能被立即訪問(通常是因?yàn)榫W(wǎng)絡(luò)連接忙),那么當(dāng)前的線程將被阻塞。這使得在這兩個(gè)方法等待指定的流變?yōu)榭捎玫倪@段時(shí)間里,其他的線程就有機(jī)會(huì)去執(zhí)行有用的工作。

available方法使我們可以去檢查當(dāng)前可讀入的字節(jié)數(shù)量,這意味著像下面這樣的代碼片段就不可能被阻塞:

當(dāng)你完成對輸入/輸出流的讀寫時(shí),應(yīng)該通過調(diào)用close方法來關(guān)閉它,這個(gè)調(diào)用會(huì)釋放掉十分有限的操作系統(tǒng)資源。如果一個(gè)應(yīng)用程序打開了過多的輸入/輸出流而沒有關(guān)閉,那么系統(tǒng)資源將被耗盡。關(guān)閉一個(gè)輸出流的同時(shí)還會(huì)沖刷用于該輸出流的緩沖區(qū):所有被臨時(shí)置于緩沖區(qū)中,以便用更大的包的形式傳遞的字節(jié)在關(guān)閉輸出流時(shí)都將被送出。特別是,如果不關(guān)閉文件,那么寫出字節(jié)的最后一個(gè)包可能將永遠(yuǎn)也得不到傳遞。當(dāng)然,我們還可以用flush方法來人為地沖刷這些輸出。

即使某個(gè)輸入/輸出流類提供了使用原生的read和write功能的某些具體方法,應(yīng)用系統(tǒng)的程序員還是很少使用它們,因?yàn)榇蠹腋信d趣的數(shù)據(jù)可能包含數(shù)字、字符串和對象,而不是原生字節(jié)。

我們可以使用眾多的從基本的InputStream和OutputStream類導(dǎo)出的某個(gè)輸入/輸出類,而不只是直接使用字節(jié)。

java.io.InputStream 1.0

·abstract int read()

從數(shù)據(jù)中讀入一個(gè)字節(jié),并返回該字節(jié)。這個(gè)read方法在碰到輸入流的結(jié)尾時(shí)返回-1。

·int read(byte[]b)

讀入一個(gè)字節(jié)數(shù)組,并返回實(shí)際讀入的字節(jié)數(shù),或者在碰到輸入流的結(jié)尾時(shí)返回-1。這個(gè)read方法最多讀入b.length個(gè)字節(jié)。

·int read(byte[]b,int off,int len)

讀入一個(gè)字節(jié)數(shù)組。這個(gè)read方法返回實(shí)際讀入的字節(jié)數(shù),或者在碰到輸入流的結(jié)尾時(shí)返回-1。

參數(shù):b 數(shù)據(jù)讀入的數(shù)組

off 第一個(gè)讀入字節(jié)應(yīng)該被放置的位置在b中的偏移量

len 讀入字節(jié)的最大數(shù)量

·long skip(long n)

在輸入流中跳過n個(gè)字節(jié),返回實(shí)際跳過的字節(jié)數(shù)(如果碰到輸入流的結(jié)尾,則可能小于n)。

·int available()

返回在不阻塞的情況下可獲取的字節(jié)數(shù)(回憶一下,阻塞意味著當(dāng)前線程將失去它對資源的占用)。

·void close()

關(guān)閉這個(gè)輸入流。

·void mark(int readlimit)

在輸入流的當(dāng)前位置打一個(gè)標(biāo)記(并非所有的流都支持這個(gè)特性)。如果從輸入流中已經(jīng)讀入的字節(jié)多于readlimit個(gè),則這個(gè)流允許忽略這個(gè)標(biāo)記。

·void reset()

返回到最后一個(gè)標(biāo)記,隨后對read的調(diào)用將重新讀入這些字節(jié)。如果當(dāng)前沒有任何標(biāo)記,則這個(gè)流不被重置。

·boolean markSupported()

如果這個(gè)流支持打標(biāo)記,則返回true。

java.io.OutputStream 1.0

·abstract void write(int n)

寫出一個(gè)字節(jié)的數(shù)據(jù)。

·void write(byte[]b)

·void write(byte[]b,int off,int len)

寫出所有字節(jié)或者某個(gè)范圍的字節(jié)到數(shù)組b中。

參數(shù):

b 數(shù)據(jù)寫出的數(shù)組

off 第一個(gè)寫出字節(jié)在b中的偏移量

len 寫出字節(jié)的最大數(shù)量

·void close()

沖刷并關(guān)閉輸出流。

·void flush()

沖刷輸出流,也就是將所有緩沖的數(shù)據(jù)發(fā)送到目的地。

主站蜘蛛池模板: 新津县| 定南县| 元阳县| 区。| 崇左市| 化德县| 邹平县| 小金县| 客服| 鸡西市| 乾安县| 德化县| 梁山县| 盈江县| 武威市| 海晏县| 隆林| 游戏| 永昌县| 镇雄县| 江北区| 宁远县| 乌兰浩特市| 博爱县| 朝阳县| 昌平区| 湖口县| 台湾省| 莱州市| 西峡县| 凌海市| 江永县| 陕西省| 五河县| 汕头市| 和平县| 教育| 温州市| 中宁县| 印江| 临沂市|