一.介紹
數(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晰甚;