從屌絲到架構師的飛越(IO流篇)-流

一.介紹

數(shù)據(jù)流(data stream)最初是通信領域使用的概念士嚎,代表傳輸中所使用的信息的數(shù)字編碼信號序列。然而,我們所提到的數(shù)據(jù)流概念與此不同路狮。這個概念最初在1998年由Henzinger在文獻87中提出,他將數(shù)據(jù)流定義為“只能以事先規(guī)定好的順序被讀取一次的數(shù)據(jù)的一個序列”蔚约。

流是一組有順序的奄妨,有起點和終點的字節(jié)集合,是對數(shù)據(jù)傳輸?shù)目偡Q或抽象苹祟。即數(shù)據(jù)在兩設備間的傳輸稱為流砸抛,流的本質是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類树枫,方便更直觀的進行數(shù)據(jù)操作直焙。

Java中對文件的操作是以流的方式進行的。流是Java內存中的一組有序數(shù)據(jù)序列砂轻。Java將數(shù)據(jù)從源(文件奔誓、內存、鍵盤搔涝、網(wǎng)絡)

讀入到內存中丝里,形成了流,然后將這些流還可以寫到另外的目的地(文件体谒、內存杯聚、控制臺、網(wǎng)絡)抒痒,之所以稱為流幌绍,是因為這個數(shù)據(jù)序列在不同時刻所操作的是源的不同部分。

二.知識點介紹

1故响、流的分類

2傀广、字節(jié)流

3、字符流

三.上課對應視頻的說明文檔

1彩届、流的分類

(1) 根據(jù)處理數(shù)據(jù)類型的不同分為:字符流和字節(jié)流

A.字符流

字符流的由來: 因為數(shù)據(jù)編碼的不同伪冰,而有了對字符進行高效操作的流對象。

字符流是以16位的Unicode碼表示的字符為基本處理單位樟蠕,進行文本數(shù)據(jù)的讀寫贮聂。

Reader和Writer是java.io包中所有字符流的抽象基類靠柑。

B.字節(jié)流

字節(jié)流類是從抽象類 InputStream和OutputStream派生出來的一系列類。這類流以字節(jié)(byte)為基本處理單位吓懈。

字節(jié)流是以8位的Unicode碼表示的字符為基本處理單位歼冰,進行文本數(shù)據(jù)的讀寫。

C.字符流與字節(jié)流區(qū)別

讀寫單位不同:字節(jié)流以字節(jié)(8bit)為單位耻警,字符流以字符為單位隔嫡,根據(jù)碼表映射字符,一次可能讀多個字節(jié)甘穿。

處理對象不同:字節(jié)流能處理所有類型的數(shù)據(jù)(如圖片腮恩、avi等),而字符流只能處理字符類型的數(shù)據(jù)温兼。

字節(jié)流在操作的時候本身是不會用到緩沖區(qū)的秸滴,是文件本身的直接操作的;而字符流在操作的時候下后是會用到緩沖區(qū)的妨托,是通過緩沖區(qū)來操作文件缸榛,我們將在下面驗證這一點。

結論:優(yōu)先選用字節(jié)流兰伤。首先因為硬盤上的所有文件都是以字節(jié)的形式進行傳輸或者保存的内颗,包括圖片等內容。但是字符只是在內存中才會形成的敦腔,所以在開發(fā)中均澳,字節(jié)流使用廣泛。

(2) 根據(jù)數(shù)據(jù)流向不同分為:輸入流和輸出流

A.輸入流

B.輸出流

(3) 從流的分工不同分為:節(jié)點流和處理流符衔;

A.節(jié)點流

節(jié)點流為可以從一個特定的數(shù)據(jù)源(節(jié)點)讀寫數(shù)據(jù)(文件,內存)

B.處理流

處理流是"連接"在已存在的流(節(jié)點流或處理流)之上,通過對數(shù)據(jù)的處理為程序提供更為強大的讀寫功能

C.節(jié)點流找前,處理流分類

2、字節(jié)流

(1)輸入字節(jié)流InputStream

InputStream類直接繼承Object類判族,是處理所有字節(jié)流輸入類的父類躺盛。

(2)主要方法如下:

從流中讀取數(shù)據(jù):

int read( ); //讀取一個字節(jié),返回值為所讀的字節(jié)(0~255),返回-1已到輸入流的末尾形帮。

int read( byte b[ ] ); //讀取多個字節(jié)槽惫,放置到字節(jié)數(shù)組b中,通常讀取的字節(jié)數(shù)量為b的長度辩撑,返回值為實際讀取的字節(jié)的數(shù)量

int read( byte b[ ], int off, int len ); //讀取len個字節(jié)界斜,放置到以下標off開始字節(jié)數(shù)組b中,返回值為實際讀取的字節(jié)的數(shù)量

int available( ); //返回值為流中尚未讀取的字節(jié)的數(shù)量

long skip( long n )合冀; //讀指針跳過n個字節(jié)不讀各薇,返回值為實際跳過的字節(jié)數(shù)量

關閉流:

close( ); //流操作完畢后必須關閉

使用輸入流中的標記:

void mark( int readlimit ); //記錄當前讀指針所在位置,readlimit表示讀指針讀出readlimit個字節(jié)后所標記的指針位置才失效

void reset( ); //把讀指針重新指向用mark方法所記錄的位置

boolean markSupported( ); //當前的流是否支持讀指針的記錄功能

(3)輸出字節(jié)流OutputStream

OutputStream類直接繼承Object類君躺,是處理所有字節(jié)流輸出類的父類峭判。

(4)主要方法如下:

輸出數(shù)據(jù):

void write( int b ); //往流中寫一個字節(jié)b

void write( byte b[ ] ); //往流中寫一個字節(jié)數(shù)組b

void write( byte b[ ], int off, int len ); //把字節(jié)數(shù)組b中從下標off開始开缎,長度為len的字節(jié)寫入流中

flush( ); //刷空輸出流朝抖,并輸出所有被緩存的字節(jié)啥箭,由于某些流支持緩存功能谍珊,該方法將把緩存中所有內容強制輸出到流中治宣。

關閉流:

close( ); //流操作完畢后必須關閉

3、字符流

(1)輸入字符流Reader

Reader類是處理所有字符流輸入類的父類砌滞。

(2)主要方法如下:

讀取字符方法:

public int read() throws IOException; /*讀取一個字符侮邀,返回值為讀取的字符*/

public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數(shù)組cbuf[]中,返回值為實際讀取的字符的數(shù)量*/

public abstract int read(char cbuf[],int off,int len) throws IOException; /*讀取len個字符贝润,從數(shù)組cbuf[]的下標off處開始存放绊茧,返回值為實際讀取的字符數(shù)量,該方法必須由子類實現(xiàn)*/

標記流方法:

public boolean markSupported(); /*判斷當前流是否支持做標標記*/

public void mark(int readAheadLimit) throws IOException; /*給當前流作標記,最多支持readAheadLimit個字符的回溯。*/

public void reset() throws IOException; /*將當前流重置到做標記處*/

public long skip(long n) throws IOException;/*跳過n個字符不讀毅哗,返回實際跳過的字節(jié)數(shù)*/

關閉流方法:

public abstract void close() throws IOException;/*關閉流釋放內存資源*/

(3)輸出字符流Writer

Writer類是處理所有字符流輸出類的父類榜轿。

(4)主要方法如下:

向輸出流寫入字符:

public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流

public void write(char cbuf[]) throws IOException泼返;//將字符數(shù)組cbuf[]寫入輸出流

public abstract void write(char cbuf[],int off,int len) throws IOException; /*將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個字符寫入輸出流*/

public void write(String str) throws IOException;//將字符串str中的字符寫入輸出流

public void write(String str,int off,int len) throws IOException仑乌;/*將字符串str 中從索引off開始處的len個字符寫入輸出流*/

flush( ):刷空輸出流,并輸出所有被緩存的字節(jié)琴锭。

關閉流:

public abstract void close() throws IOException晰甚;

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市决帖,隨后出現(xiàn)的幾起案子厕九,更是在濱河造成了極大的恐慌,老刑警劉巖地回,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁远,死亡現(xiàn)場離奇詭異,居然都是意外死亡落君,警方通過查閱死者的電腦和手機穿香,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绎速,“玉大人皮获,你說我怎么就攤上這事∥圃” “怎么了洒宝?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵购公,是天一觀的道長。 經(jīng)常有香客問我雁歌,道長宏浩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任靠瞎,我火速辦了婚禮比庄,結果婚禮上,老公的妹妹穿的比我還像新娘乏盐。我一直安慰自己佳窑,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布父能。 她就那樣靜靜地躺著神凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪何吝。 梳的紋絲不亂的頭發(fā)上溉委,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音爱榕,去河邊找鬼瓣喊。 笑死,一個胖子當著我的面吹牛呆细,可吹牛的內容都是我干的型宝。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼絮爷,長吁一口氣:“原來是場噩夢啊……” “哼趴酣!你這毒婦竟也來了?” 一聲冷哼從身側響起坑夯,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤岖寞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柜蜈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗谆,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年淑履,在試婚紗的時候發(fā)現(xiàn)自己被綠了隶垮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡秘噪,死狀恐怖狸吞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蹋偏,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布便斥,位于F島的核電站,受9級特大地震影響威始,放射性物質發(fā)生泄漏枢纠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一黎棠、第九天 我趴在偏房一處隱蔽的房頂上張望晋渺。 院中可真熱鬧,春花似錦葫掉、人聲如沸些举。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驶臊,卻和暖如春挪挤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背关翎。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工扛门, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵寝。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓论寨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爽茴。 傳聞我的和親對象是個殘疾皇子葬凳,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容