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