IO_字節(jié)流

一.IO概述


1.1 什么是IO

生活中,你肯定經(jīng)歷過這樣的場景。當你編輯一個文本文件,忘記了ctrl+s ,可能文件就白白編輯了。當你電腦上插入一個U盤,可以把一個視頻,拷貝到你的電腦硬盤里。那么數(shù)據(jù)都是在哪些設(shè)備上的呢?鍵盤、內(nèi)存、硬盤、外接設(shè)備等等。

我們把這種數(shù)據(jù)的傳輸,可以看做是一種數(shù)據(jù)的流動,按照流動的方向,以內(nèi)存為基準,分為輸入input 和輸出output ,即流向內(nèi)存是輸入流,流出內(nèi)存的輸出流。

Java中I/O操作主要是指使用java.io 包下的內(nèi)容,進行輸入、輸出操作。輸入也叫做讀取數(shù)據(jù),輸出也叫做作寫出數(shù)據(jù)

1.2 IO的分類

根據(jù)數(shù)據(jù)的流向分為:輸入流和輸出流。

輸入流:把數(shù)據(jù)從其他設(shè)備上讀取到內(nèi)存中的流。

輸出流:把數(shù)據(jù)從內(nèi)存中寫出到其他設(shè)備上的流

格局數(shù)據(jù)的類型分為:字節(jié)流和字符流。

字節(jié)流:以字節(jié)為單位,讀寫數(shù)據(jù)的流。

字符流:以字符為單位,讀寫數(shù)據(jù)的流。

1.3 IO的流向說明圖解

IO的流向說明圖解

1.4 頂級父類們

父類

二.字節(jié)流


2.1 一切皆為字節(jié)

一切文件數(shù)據(jù)(文本、圖片、視頻等)在存儲時,都是以二進制數(shù)字的形式保存,都一個一個的字節(jié),那么傳輸時一樣如此。所以,字節(jié)流可以傳輸任意文件數(shù)據(jù)。在操作流的時候,我們要時刻明確,無論使用什么樣的流對象,底層傳輸?shù)氖冀K為二進制數(shù)據(jù)。

2.2 字節(jié)輸出流【OutputStream】

java.io.OutputStream 抽象類是表示字節(jié)輸出流的所有類的超類,將指定的字節(jié)信息寫出到目的地。它定義了字節(jié)輸出流的基本共性功能方法。

public void close()?:關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

public void flush()?:刷新此輸出流并強制任何緩沖的輸出字節(jié)被寫出。

public void write(byte[] b)?:將字節(jié)數(shù)組中的內(nèi)容, 寫出到輸出流關(guān)聯(lián)的文件中

public void write(byte[] b, int off, int len) :將字節(jié)數(shù)組中, 從off索引, 開始的len個字節(jié), 寫出到輸出流關(guān)聯(lián)的文件中

小貼士

close方法,當完成流的操作時,必須調(diào)用此方法,釋放系統(tǒng)資源。

2.3 FileOutputStream類

OutputStream?有很多子類,我們從最簡單的一個子類開始。

java.io.FileOutputStream?類是文件輸出流,用于將數(shù)據(jù)寫出到文件。

a.構(gòu)造方法

public FileOutputStream(File file)?:創(chuàng)建文件輸出流以寫入由指定的 File對象表示的文件。

public FileOutputStream(String name)?: 創(chuàng)建文件輸出流以指定的名稱寫入文件。

當你創(chuàng)建一個流對象時,必須傳入一個文件路徑。該路徑下,如果沒有這個文件,會創(chuàng)建該文件。如果有這個文件,會清空這個文件的數(shù)據(jù)。

構(gòu)造舉例,代碼如下:

構(gòu)造舉例代碼
程序運行之后創(chuàng)建的兩個文件對象??

b.寫出字節(jié)數(shù)據(jù)

1.?寫出字節(jié): write(int b) 方法,每次可以寫出一個字節(jié)數(shù)據(jù),代碼使用演示:

write(int b)寫出字節(jié)
輸出結(jié)果


小貼士:

a. 雖然參數(shù)為int類型四個字節(jié),但是只會保留一個字節(jié)的信息寫出。

b. 流操作完畢后,必須釋放系統(tǒng)資源,調(diào)用close方法,千萬記得。

2. 寫出字節(jié)數(shù)組: write(byte[] b) ,每次可以寫出數(shù)組中的數(shù)據(jù),代碼使用演示:

write(byte[] b)寫出字節(jié)數(shù)組??
運行結(jié)果

3. 寫出指定長度字節(jié)數(shù)組: write(byte[] b, int off, int len) ,每次寫出從off索引開始,len個字節(jié),代碼使用演示:

?寫出指定長度字節(jié)數(shù)組:?write(byte[] b, int off, int len)??
輸出結(jié)果


c.數(shù)據(jù)追加續(xù)寫

經(jīng)過以上的演示,每次程序運行,創(chuàng)建輸出流對象,都會清空目標文件中的數(shù)據(jù)。如何保留目標文件中數(shù)據(jù),還能繼續(xù)添加新數(shù)據(jù)呢?

public FileOutputStream(File file, boolean append)?: 創(chuàng)建文件輸出流以寫入由指定的 File對象表示的文件。

public FileOutputStream(String name, boolean append)?: 創(chuàng)建文件輸出流以指定的名稱寫入文件。

這兩個構(gòu)造方法,參數(shù)中都需要傳入一個boolean類型的值, true 表示追加數(shù)據(jù), false 表示清空原有數(shù)據(jù)。這樣創(chuàng)建的輸出流對象,就可以指定是否追加續(xù)寫了,代碼使用演示:

追加續(xù)寫


運行結(jié)果


d.寫出換行

Windows系統(tǒng)里,換行符號是\r\n。代碼使用演示:

\r\n寫出換行
運行結(jié)果


回車符\r 和換行符\n :

回車符:回到一行的開頭(return)。

換行符:下一行(newline)。

系統(tǒng)中的換行:

Windows系統(tǒng)里,每行結(jié)尾是 回車+換行 ,即\r\n?;

Unix系統(tǒng)里,每行結(jié)尾只有 換行 ,即\n?;

Mac系統(tǒng)里,每行結(jié)尾是 回車 ,即\r?。從 Mac OS X開始與Linux統(tǒng)一。

2.4 字節(jié)輸入流【InputStream】

java.io.InputStream?抽象類是表示字節(jié)輸入流的所有類的超類,可以讀取字節(jié)信息到內(nèi)存中。它定義了字節(jié)輸入流的基本共性功能方法。

public void close() :關(guān)閉此輸入流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。

public abstract int read() :?從此輸入流中(輸入流關(guān)聯(lián)的文件中)讀取一個數(shù)據(jù)字節(jié)

特點: read可以讀取一個字節(jié), 得到的是int類型的數(shù)字; 每讀取一次, 下一次讀取就可以讀取到下一個字節(jié),如果讀取到文件的末尾, 則返回-1.

public int read(byte[] b) :?從輸入流中讀取一些字節(jié)數(shù),并將它們存儲到字節(jié)數(shù)組 b中 。返回值是有效字節(jié)的個數(shù),如果讀取到文件的末尾, 返回-1.

小貼士:close方法,當完成流的操作時,必須調(diào)用此方法,釋放系統(tǒng)資源。

2.5FileInputStream類

java.io.FileInputStream?類是文件輸入流,從文件中讀取字節(jié)。

a.構(gòu)造方法

FileInputStream(File file)?: 通過打開與實際文件的連接來創(chuàng)建一個 FileInputStream ,該文件由文件系統(tǒng)中的 File對象 file命名。

FileInputStream(String name)?: 通過打開與實際文件的連接來創(chuàng)建一個 FileInputStream ,該文件由文件系統(tǒng)中的路徑名 name命名。

當你創(chuàng)建一個流對象時,必須傳入一個文件路徑。該路徑下,如果沒有該文件,會拋出FileNotFoundException?。

構(gòu)造舉例,代碼如下:

創(chuàng)建字節(jié)輸入流對象

b.讀取字節(jié)數(shù)據(jù)

1. 讀取字節(jié): read 方法,每次可以讀取一個字節(jié)的數(shù)據(jù),提升為int類型,讀取到文件末尾,返回-1 ,代碼使用演示:

準備一個Read.txt文件放在工作目錄下,我們用字節(jié)輸入流來讀取它

準備讀取的文件

讀取代碼:

read 方法,每次可以讀取一個字節(jié)的數(shù)據(jù)??

循環(huán)改進讀取方式,代碼使用演示:

利用while循環(huán)讀取
控制臺輸出結(jié)果

小貼士:

a). 雖然讀取了一個字節(jié),但是會自動提升為int類型。

b). 流操作完畢后,必須釋放系統(tǒng)資源,調(diào)用close方法,千萬記得。

2.使用字節(jié)數(shù)組讀?。?i>?read(byte[] b)?,每次讀取b的長度個字節(jié)到數(shù)組中,返回讀取到的有效字節(jié)個數(shù),讀取到末尾時,返回-1 ,代碼使用演示:

read(byte[] b) : 從輸入流中讀取一些字節(jié)數(shù),并將它們存儲到字節(jié)數(shù)組 b中??
輸出結(jié)果,有個錯誤數(shù)據(jù)b??

錯誤數(shù)據(jù)d ,是由于最后一次讀取時,只讀取一個字節(jié)e ,數(shù)組中,上次讀取的數(shù)據(jù)沒有被完全替換,所以要通過len ,獲取有效的字節(jié),代碼使用演示:

read(byte[] b): 的返回值是有效字節(jié)的個數(shù)??
正確的打印結(jié)果

2.6 字節(jié)流練習:

工作文件夾準備一張圖片來拷貝它

a.圖片復制(字節(jié)流一個字節(jié)一個字節(jié)的拷貝)

字節(jié)流一個字節(jié)一個字節(jié)的拷貝??

b.圖片復制(使用數(shù)組的方式拷貝)

使用數(shù)組的方式拷貝
結(jié)果


查看當前工作文件夾

單擊此處查看當前工作文件夾的路徑??
此處為當前工作文件夾的路徑??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容