摘要:基本輸入流輸入流類中包含兩類功能輸入流的兩大功能讀取流中字節(jié)數(shù)據(jù)的功能是通過方法來完成。基本輸出流與類相對(duì)應(yīng)的類表示基本的輸出流,用來把數(shù)據(jù)從程序輸出到其他地方。
一堆廢話(趕快跳過)
在我們的日常開發(fā)中 I/O 涉及到我們開發(fā)的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我們的日常開發(fā)中還是占據(jù)很高的比重。
概念(不看也行)最基本的I/O 流是 java.io 包中的抽象類 java.io.InputStream 和 java.io.OutputStream。s有預(yù)留的設(shè)計(jì)比較早,因此并沒有采用現(xiàn)在流行的面向接口的編程思路,而是采用了抽象類。新增的IO相關(guān)的API則大量使用了接口。如果留的實(shí)現(xiàn)只是對(duì)使用者暴漏字節(jié)這個(gè)層次的細(xì)節(jié),則可以直接集成InputStream 或 OutputStream 類,并且提供自己二外的能力。
在接下來的幾個(gè)章節(jié)中,會(huì)逐章記錄
以下各種流類的詳細(xì)使用方法
BufferedInputStream, BufferedOutputStream 緩沖復(fù)用流
ByteArrayInputStream, ByteArrayOutputStream byte數(shù)組緩沖流
DataInputStream, DataOutputStream java原生數(shù)據(jù)流
ObjectInputStream, ObjectOutputStream 對(duì)象序列化流
PushbackInputStream, PushbackOutputStream 推回流
PipedInputStream, PipedOutputStream 管道流
SequenceInputStream, SequenceOutputStream 序列流
和字符流類和字符流的的裝飾類
Reader, Writer
InputStreamReader, InputStreamWriter
StringReader, StringWriter
BufferedReader, BufferedWriter
CharArrayReader, CharArrayWriter
同時(shí)也會(huì)記錄一些 java8 融入 Google guava 類庫對(duì) 流類的支持。
基本輸入流輸入流 InputStream類中包含兩類功能
輸入流的兩大功能讀取流中字節(jié)數(shù)據(jù)的功能是通過 read 方法來完成。該方法有以下3種重載形式
public abstract int read() throws IOException
public int read(byte b[]) throws IOException
public int read(byte b[], int off, int len) throws IOException
比較常見的操作流的方式就是 創(chuàng)建一個(gè)字節(jié)數(shù)組作為緩沖區(qū),然后循環(huán)讀取,直到read方法返回-1或拋出 java.io.IOException 異常。read方法的返回值是每次調(diào)用中成功讀取的字節(jié)數(shù)。 需要要注意的是在讀取的過程中,對(duì)read方法調(diào)用是阻塞的。當(dāng)流中沒有數(shù)據(jù)可用時(shí),對(duì)read方法的調(diào)用需要等待。這種阻塞式的特性可能會(huì)成為應(yīng)用中的性能瓶頸。
如果不使用字節(jié)數(shù)組,那么read方法每次只能讀取到一個(gè)字節(jié),再有緩沖區(qū)的情況下雖然InputStream類每次也只是讀取一個(gè)字節(jié),但是 InputStream類的子類一般會(huì)接受一個(gè)緩沖區(qū)最為參數(shù)的read方法提供更高效的實(shí)現(xiàn)。
抽象正像他的名字一樣,字節(jié)流是流動(dòng)的,像流水一樣。劉中的字節(jié)一旦流過去,就無法重新使用。
控制流的功能。
close 關(guān)閉功能
通過 close 方法,我們可以關(guān)閉一個(gè) 流,就像擰上水管龍頭一樣。java7及以后,更推薦使用 try-with-resource 語句來使用流。可以避免顯示的調(diào)用close方法。
javatry ( FileInputStream fInput = new FileInputStream(new File("path/to/exists_file")); FileOutputStream fOutput = new FileOutputStream(new File("path/to/new_file")); ) { // ....fInput -> read -> fOutput } catch (IOException e) { ..... } catch (FileNotFoundException e) { ..... }
skip 跳過若干個(gè)字節(jié)。相當(dāng)于保留當(dāng)前的位置往后移動(dòng)若干個(gè)字節(jié),這個(gè)功能可以通過skip方法來實(shí)現(xiàn)并不是所有的InputStream累都支持skip方法。
mark 讀取位置標(biāo)記
reset 讀取位置重置
標(biāo)記和重置是配合使用的,可以實(shí)現(xiàn)可以實(shí)現(xiàn)流中的內(nèi)容重復(fù)讀取,而不會(huì)像一般的讀取那樣操作,數(shù)據(jù)流過去之后就無法在次讀取。但是并不是所有的流都支持標(biāo)記功能,因此在使用mark方法來標(biāo)記當(dāng)前位置之前,需要通過markSupporetd方法來判斷當(dāng)前流的實(shí)現(xiàn)是否支持標(biāo)記功能。
available 獲取當(dāng)沒有阻塞情況下,當(dāng)前流中還有多少字節(jié)可供讀取。如果我們每次讀取調(diào)用available方法獲取到的字節(jié)書,不如在讀取一個(gè)大文件的同時(shí)對(duì)文件的內(nèi)容進(jìn)行處理,如果每次讀取是都不發(fā)生阻塞,就可以比較好的平均數(shù)據(jù)讀取和處理的時(shí)間。
基本輸出流與InputStream類相對(duì)應(yīng)的OutputStream類表示基本的輸出流,用來把數(shù)據(jù)從程序輸出到其他地方。基本OutputStream類的對(duì)象也是在自己這個(gè)層次上操作。其中最主要的是寫入數(shù)據(jù)的write方法。
write 寫入方法。
public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException
write 方法也有3種類似的重載形式,可以每次寫入一個(gè)字節(jié),也可以寫入一個(gè)字節(jié)數(shù)組中全部或部分內(nèi)容。
控制方法
close 方法
關(guān)閉當(dāng)前輸出流
flush 方法
強(qiáng)制要求OutputStream類對(duì)象對(duì)暫時(shí)保持內(nèi)部緩沖區(qū)中的內(nèi)容立即進(jìn)行實(shí)際的寫入操作。因?yàn)橛行㎡utputStream類的子類會(huì)在內(nèi)部維護(hù)一個(gè)緩沖區(qū),通過write方法寫入的數(shù)據(jù)會(huì)被首先放在這個(gè)緩沖區(qū)中,然后再摸個(gè)適合的實(shí)際執(zhí)行已經(jīng)緩沖的內(nèi)容的寫入操作。在一般的場景中OutputStream對(duì)象的使用者一般不需要直接調(diào)用flush方法保證內(nèi)部緩沖區(qū)數(shù)據(jù)成功寫入。這是因?yàn)楫?dāng)OutputStream類對(duì)象內(nèi)部的緩沖區(qū)滿了以后,會(huì)自動(dòng)執(zhí)行寫入操作。OutputStram類的對(duì)象被關(guān)閉時(shí),flush方法一般也會(huì)被自動(dòng)調(diào)用。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64233.html
摘要:通過多個(gè)裝飾類實(shí)現(xiàn)責(zé)任鏈模式,它將對(duì)一個(gè)輸入流的不同處理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字節(jié)輸入流,抽象類,定義了讀取原始字節(jié)的所有基本方法1.1.1、public abstract int read() throws IOException 讀取一個(gè)字節(jié)的方法,最基礎(chǔ)的方法1.1.2、public int read(byte b[], in...
摘要:是方法返回值的數(shù)據(jù)類型。方法名和參數(shù)表共同構(gòu)成方法簽名。構(gòu)造方法和它所在類的名字相同,但構(gòu)造方法沒有返回值。輸入流表示從一個(gè)源讀取數(shù)據(jù),輸出流表示向一個(gè)目標(biāo)寫數(shù)據(jù)。下圖是一個(gè)描述輸入流和輸出流的類層次圖。有多種構(gòu)造方法可用來創(chuàng)建對(duì)象。 我們經(jīng)常使用到 System.out.println(),那么它是什么呢? 一、系統(tǒng)方法 我們經(jīng)常使用到 System.out.println(),那么...
摘要:一面試題及剖析今日面試題今天壹哥帶各位復(fù)習(xí)一塊可能會(huì)令初學(xué)者比較頭疼的內(nèi)容,起碼當(dāng)時(shí)讓我很有些頭疼的內(nèi)容,那就是流。在這里壹哥會(huì)從兩部分展開介紹流,即與流。除此之外盡量使用字節(jié)流。關(guān)閉此輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復(fù)習(xí)一塊可...
摘要:在包下主要包括輸入輸出兩種流,每種輸入輸出流又可分為字節(jié)流和字符流兩大類。輸入輸出是從程序運(yùn)行所在的內(nèi)存的角度而言的。的輸入流主要由和作為基類,而輸出流主要由和作為基類。 本章主要參考和摘自瘋狂java講義上面的(java編程思想的后面看過后有新的內(nèi)容再補(bǔ)充進(jìn)去吧)。 輸入輸出是所有程序都必需的部分————使用輸入機(jī)制允許程序讀取外部數(shù)據(jù)(包括磁盤、光盤等存儲(chǔ)設(shè)備上的數(shù)據(jù)和用戶輸入的...
摘要:分類一按操作方式類結(jié)構(gòu)字節(jié)流和字符流字節(jié)流以字節(jié)為單位,每次次讀入或讀出是位數(shù)據(jù)。該對(duì)象并不是流體系中的一員,其封裝了字節(jié)流,同時(shí)還封裝了一個(gè)緩沖區(qū)字符數(shù)組,通過內(nèi)部的指針來操作字符數(shù)組中的數(shù)據(jù)。 分類一:按操作方式(類結(jié)構(gòu)) 字節(jié)流和字符流: 字節(jié)流:以字節(jié)為單位,每次次讀入或讀出是8位數(shù)據(jù)。可以讀任何類型數(shù)據(jù)。 字符流:以字符為單位,每次次讀入或讀出是16位數(shù)據(jù)。其只能讀取字符類...
閱讀 2216·2021-09-07 09:58
閱讀 3391·2019-08-30 14:07
閱讀 1305·2019-08-29 12:32
閱讀 667·2019-08-29 11:06
閱讀 3692·2019-08-26 18:18
閱讀 3731·2019-08-26 17:35
閱讀 1381·2019-08-26 11:35
閱讀 611·2019-08-26 11:35