一.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的流向說明圖解
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)造舉例驳遵,代碼如下:
b.寫出字節(jié)數(shù)據(jù)
1.?寫出字節(jié): write(int b) 方法淫奔,每次可以寫出一個字節(jié)數(shù)據(jù),代碼使用演示:
小貼士:
a. 雖然參數(shù)為int類型四個字節(jié)堤结,但是只會保留一個字節(jié)的信息寫出唆迁。
b. 流操作完畢后,必須釋放系統(tǒng)資源竞穷,調(diào)用close方法唐责,千萬記得。
2. 寫出字節(jié)數(shù)組: write(byte[] b) 瘾带,每次可以寫出數(shù)組中的數(shù)據(jù)鼠哥,代碼使用演示:
3. 寫出指定長度字節(jié)數(shù)組: write(byte[] b, int off, int len) ,每次寫出從off索引開始,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ù)寫了彩郊,代碼使用演示:
d.寫出換行
Windows系統(tǒng)里,換行符號是\r\n蚪缀。代碼使用演示:
回車符\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)造舉例,代碼如下:
b.讀取字節(jié)數(shù)據(jù)
1. 讀取字節(jié): read 方法橱野,每次可以讀取一個字節(jié)的數(shù)據(jù)朽缴,提升為int類型,讀取到文件末尾水援,返回-1 密强,代碼使用演示:
準備一個Read.txt文件放在工作目錄下,我們用字節(jié)輸入流來讀取它
讀取代碼:
循環(huán)改進讀取方式或渤,代碼使用演示:
小貼士:
a). 雖然讀取了一個字節(jié),但是會自動提升為int類型许帐。
b). 流操作完畢后劳坑,必須釋放系統(tǒng)資源,調(diào)用close方法成畦,千萬記得。
2.使用字節(jié)數(shù)組讀壤钥:?read(byte[] b)?循帐,每次讀取b的長度個字節(jié)到數(shù)組中,返回讀取到的有效字節(jié)個數(shù)舀武,讀取到末尾時拄养,返回-1 ,代碼使用演示:
錯誤數(shù)據(jù)d ,是由于最后一次讀取時寻馏,只讀取一個字節(jié)e 棋弥,數(shù)組中,上次讀取的數(shù)據(jù)沒有被完全替換诚欠,所以要通過len 顽染,獲取有效的字節(jié)漾岳,代碼使用演示:
2.6 字節(jié)流練習(xí):
工作文件夾準備一張圖片來拷貝它