1.概述
? ? IO參照物是當(dāng)前程序使用內(nèi)存
? ? I : input 從硬盤讀取數(shù)據(jù)到內(nèi)存! read 讀
? ? O : output 從內(nèi)存寫入數(shù)據(jù)到硬盤! write 寫
? ? 對于Java而言: 按照處理單位來看
? ? ? ? 字節(jié)流: 所有的數(shù)據(jù)按照字節(jié)方式進(jìn)行傳輸!
? ? ? ? 字符流: 數(shù)據(jù)按照當(dāng)前系統(tǒng)采用的編碼集方式進(jìn)行字符操作,該操作局限性很大!
? ? ? ? ? ? ? ? ? ? ? ? 所能操作的并且不會出現(xiàn)錯(cuò)誤的文件,有且只有記事本打開無亂碼的文本文件
? ? 組合:字節(jié)輸入流,字節(jié)輸出流,字符輸入流,字符輸出流。
2.緩存概念
? ? 緩存緩沖有什么好處?
? ? ? ? 一般的網(wǎng)站,第二次打開總比第一次打開速度要快!
? ? ? ? 第一次加載網(wǎng)站打開的過程中,會對當(dāng)前網(wǎng)頁一些固定資源進(jìn)行保存,提高用戶在訪問頁面時(shí)的速度,優(yōu)化體驗(yàn)!
? ? 開發(fā)中使用緩存緩沖可以有效地提高文件操作效率!
3. IO流分類
? ? class InputStream? ? 字節(jié)輸入流基類
? ? --|? ? class FileInputStream? ? 文件操作字節(jié)輸入流
? ? class OutputStream? ? 字節(jié)輸出流基類
? ? --|? ? class FileOutputStream? ? 文件操作字符輸入流
? ? class Reader? ? 字符輸入流基類
? ? --|? ? class FileReader? ? 文件操作字符輸入流
? ? class Writer? ? 字符輸出流基類
? ? --|? ? class FileWriter? ? 文件操作字符輸出流
? ? 需要學(xué)習(xí)的方法: read? ? write
? ? 緩沖流:
? ? ? ? BufferedInputStream? ? 字節(jié)輸入緩沖流
? ? ? ? BufferedOutputStream? ? 字節(jié)輸出緩沖流
? ? ? ? BufferedReader? ? ? ? 字符輸入緩沖流
? ? ? ? BufferedWriter? ? 字符輸出緩沖流
4.FileInputStream文件操作字節(jié)輸入流
? ? Constructor構(gòu)造方法
? ??????FileInputStream(String filePath);????根據(jù)用戶指定的文件路徑創(chuàng)建對應(yīng)的FileInputStream,文件操作輸入字節(jié)流,如果文件不存在,拋出異常FileNotFoundException
? ??FileInputStream(File file);????根據(jù)用戶指定對應(yīng)文件的File類對象,創(chuàng)建對應(yīng)的FileInputStream,如果文件不存在,拋出異常FileNotFoundException
? ? Method成員方法
? ? ? ? int read();? ? 從文件中讀取一個(gè)字節(jié)數(shù)據(jù)返回。如果讀取到末尾,返回-1 EOF Of File
? ? ? ? int read(byte[] buf);【重點(diǎn)】? ? 從文件中讀取數(shù)據(jù)到緩沖數(shù)組buf中,返回值類型是從文件中讀取到的字節(jié)個(gè)數(shù),如果讀取到文件末尾,返回-1,EOF Of File
? ? ? ? 讀取數(shù)據(jù)的方法,在運(yùn)行過程中出現(xiàn)了問題,拋出異常IOException
? ? 操作流程:
? ? ? ? 1.明確對應(yīng)文件的路徑,可以選擇直接給與對應(yīng)的String類型路徑,或者創(chuàng)建對應(yīng)的File類對象,作為參數(shù)
? ? ? ? 2.創(chuàng)建FileInputStream文件操作字節(jié)輸入流,打開文件操作管道
? ? ? ? 3.從FileInputStream對象中使用方法,讀取數(shù)據(jù)
? ? ? ? 4.關(guān)閉資源!FileInputStram類對象==>水龍頭!
5.FileOutputStream 文件操作字節(jié)輸出流
? ??Constructor構(gòu)造方法
? ??????FileOutputStream(String filePath);????根據(jù)用戶指定的路徑,創(chuàng)建對應(yīng)的FileOutputStream文件操作輸出流對象。如果路徑不合法,拋出異常FileNotFoundException。采用寫入數(shù)據(jù)到文件的方式,是【刪除寫】!!!文件內(nèi)容清空,在寫入數(shù)據(jù)
????????FileOutputStream(File file);????根據(jù)用戶指定的File類對象,創(chuàng)建對應(yīng)FileOutputStream文件操作輸出流對象,如果路徑不合法,拋出異常FileNotFoundException。采用寫入數(shù)據(jù)到文件的方式,是【刪除寫】!!!文件內(nèi)容清空,在寫入數(shù)據(jù)
????????FileOutputStream(String filePath, boolean append);????根據(jù)用戶指定的路徑,創(chuàng)建對應(yīng)的FileOutputStream文件操作輸出流對象。如果路徑不合法,拋出異常FileNotFoundException。append參數(shù)是boolean類型,如果傳入?yún)?shù)為true,表示【追加寫】,在文件末尾寫入數(shù)據(jù)
????????FileOutputStream(File file, boolean append);????根據(jù)用戶指定的File類對象,創(chuàng)建對應(yīng)FileOutputStream文件操作輸出流對象,如果路徑不合法,拋出異常FileNotFoundException。append參數(shù)是boolean類型,如果傳入?yún)?shù)為true,表示【追加寫】,在文件末尾寫入數(shù)據(jù)
? ??Method成員方法? ??
? ??????void write(int b);????寫入一個(gè)字節(jié)數(shù)據(jù)寫入到文件中
? ??????void write(byte[] buf);? ??寫入一個(gè)字節(jié)數(shù)組到文件中????
? ??????void write(byte[] buf, int off, int count);????寫入一個(gè)字節(jié)數(shù)組到文件中,要求從off偏移位置開始,計(jì)數(shù)count
? ? 操作流程:
? ??????1. 明確對應(yīng)文件的路徑,可以選擇直接給予對應(yīng)的String類型路徑,或者創(chuàng)建對應(yīng)的File類對象,作為參數(shù)
????????2. 創(chuàng)建FileOutputStream文件操作輸出字節(jié)流,打開文件操作管道
????????3. 使用FileOutputStream對象寫入數(shù)據(jù)到文件中
????????4. 關(guān)閉資源!!!
? ? 注意:
? ? ? ? 1.FileOutputStream擁有創(chuàng)建文件的能力,在路徑合法,且對應(yīng)目錄有寫入權(quán)限下可以創(chuàng)建文件
? ? ????2.區(qū)分刪除寫和追加寫
6.FileReader 文件操作字符輸入流
????Constructor構(gòu)造方法
????????FileReader(String filePath);????根據(jù)指定路徑的文件創(chuàng)建對應(yīng)的文件字符輸入流對象,如果文件不存在,拋出異常FileNotFoundException
FileReader(File file);????根據(jù)指定路徑的File類對象創(chuàng)建文件字符輸入流對象,如果文件不存在,拋出異常FileNotFoundException
????Method成員方法
????int read();????從文件中讀取一個(gè)字符數(shù)據(jù),返回值為int類型,int類型數(shù)據(jù)中有且只有低十六位是有效數(shù)據(jù),如果讀取到文件末尾返回-1 EOF End Of File
????int read(char[] buf);????從文件中讀取數(shù)據(jù)到char類型緩沖數(shù)組buf,返回值是讀取到字符個(gè)數(shù)。如果讀取到文件末尾返回-1 EOF End Of File
????操作流程:
????????1. 明確需要讀取數(shù)據(jù)的文件
????????2. 創(chuàng)建FileReader對象,打開文件操作管道
????????3. 使用FileReader類對象方法,讀取文件數(shù)據(jù)
????????4. 關(guān)閉資源
7.FileWriter文件操作字符輸出流
? ??Constructor構(gòu)造方法:
????????FileWriter( String filePath);????根據(jù)用戶指定的路徑,創(chuàng)建對應(yīng)的FileWriter文件操作字符輸出流對象。如果路徑不合法,拋出異常FileNotFoundException。采用寫入數(shù)據(jù)到文件的方式,是【刪除寫】!!!文件內(nèi)容清空,在寫入數(shù)據(jù)
????????FileWriter(File file);????根據(jù)用戶指定的File類對象,創(chuàng)建對應(yīng)FileWriter文件操作字符輸出流對象,如果路徑不合法,拋出異常FileNotFoundException。采用寫入數(shù)據(jù)到文件的方式,是【刪除寫】!!!文件內(nèi)容清空,在寫入數(shù)據(jù)
????????FileWriter(String filePath, boolean append);????根據(jù)用戶指定的路徑,創(chuàng)建對應(yīng)的FileWriter文件操作字符輸出流對象。如果路徑不合法,拋出異常FileNotFoundException。append參數(shù)是boolean類型,如果傳入?yún)?shù)為true,表示【追加寫】,在文件末尾寫入數(shù)據(jù)
????????FileWriter(File file, boolean append);????根據(jù)用戶指定的File類對象,創(chuàng)建對應(yīng)FileWriter文件操作字符輸出流對象,如果路徑不合法,拋出異常FileNotFoundException。append參數(shù)是boolean類型,如果傳入?yún)?shù)為true,表示【追加寫】,在文件末尾寫入數(shù)據(jù)
? ? Method成員方法:
? ??????void write(int ch);????寫入一個(gè)字符數(shù)據(jù)寫入到文件中
????????void write(char[] buf);????寫入一個(gè)字符數(shù)組到文件中
????????void write(char[] buf, int off, int count);????寫入一個(gè)字符數(shù)組到文件中,要求從off偏移位置開始,計(jì)數(shù)count
????????void write(String str);????寫入一個(gè)字符串到文件中
????????void write(String str, int offset, int count);????寫入一個(gè)字符串到文件中,要求從offset偏移位置開始,計(jì)數(shù)count
? ??注意:
????????1. FileWriter擁有創(chuàng)建文件的能力,在路徑合法,且對應(yīng)目錄有寫入權(quán)限下可以創(chuàng)建文件
????????2. 區(qū)分刪除寫和追加寫
8.關(guān)于字節(jié)流和字符流總結(jié)
? ? 1.套路是一樣的! 明確文件 - 打開管道 - 操作文件 - 關(guān)閉資源
? ? 2.核心方法? ? read 讀取,輸入;? ? write 寫入,輸出
? ? 3.輸出流有創(chuàng)建文件的能力
? ? 4.輸出流需要注意是刪除寫還是追加寫
? ? 5.一定要注意關(guān)閉資源!resource
9.文件拷貝對比
? ? 9.1 字符流字節(jié)流對比
????????????字節(jié)流拷貝:
????????????字符流拷貝:
? ??9.2字符流操作效率問題
? ? ? ????? 單字節(jié)拷貝操作:
? ??????????緩沖數(shù)組形式操作:
? ??有緩沖和無緩沖對比:
? ? ? ? 1.在沒有使用緩沖的情況下,每一次需要向磁盤讀取一個(gè)字節(jié)數(shù)據(jù),然后寫入一個(gè)字節(jié)數(shù)據(jù),這樣會導(dǎo)致代碼中出現(xiàn)太多次數(shù)的打開和關(guān)閉磁盤次數(shù)。極大影響效率!
? ? ? ? 2.緩沖之后,我們降低了對于磁盤開啟的次數(shù),并且符合CPU操作磁盤的模式,CPU從磁盤讀取數(shù)據(jù)是每次4KB