- Java核心技術(shù)·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 1333字
- 2020-10-30 18:10:37
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ā)送到目的地。
- Boost.Asio C++ Network Programming(Second Edition)
- Deploying Node.js
- Hyper-V 2016 Best Practices
- PHP程序設(shè)計(jì)(慕課版)
- Java入門很輕松(微課超值版)
- Mastering Python Scripting for System Administrators
- 跟小海龜學(xué)Python
- 我的第一本算法書
- INSTANT Sencha Touch
- Mastering Xamarin.Forms(Second Edition)
- 微服務(wù)架構(gòu)深度解析:原理、實(shí)踐與進(jìn)階
- Learning Continuous Integration with TeamCity
- Vue.js 3應(yīng)用開發(fā)與核心源碼解析
- C/C++代碼調(diào)試的藝術(shù)(第2版)
- 軟件測試技術(shù)