Java-进阶:Java-File--IO—1
#目錄
一、File 類
二、IO流
三、字節(jié)輸出流
四、字節(jié)輸入流
五、字節(jié)流文件復(fù)制
六、字符輸出流
七、字符輸入流
八、字符流復(fù)制文本文件
##一、File 類
###1. 概述
文件 和 目錄路徑名 的抽象表達(dá)形式
Java中把文件或者目錄(文件夾)都封裝成 File對(duì)象
我們要去操作硬盤(pán)上的文件,或者文件夾只要找到 File這個(gè)類即可
File類對(duì)象,只是路徑名的 抽象表示形式,即使該文件在操作系統(tǒng)上并不物理存在,也可以創(chuàng)建這個(gè)路徑所表示的File對(duì)象
###2. 構(gòu)造方法
File(String pathname):通過(guò)給定 路徑名字符串 轉(zhuǎn)換為 抽象路徑名 來(lái)創(chuàng)建一個(gè)新 File 實(shí)例
windows中的路徑或文件名不區(qū)分大小寫(xiě),但是最好別這樣,跨平臺(tái)可能會(huì)出現(xiàn)問(wèn)題
File(String parent, String child):根據(jù) parent 路徑名字符串 和 child 路徑名字符串,創(chuàng)建一個(gè)新 File 實(shí)例
好處: 單獨(dú)操作父路徑和子路徑
File(File parent, String child):根據(jù) parent 抽象路徑名 和 child 路徑名字符串,創(chuàng)建一個(gè) File 實(shí)例
好處: 父路徑是File類型,父路徑可以直接調(diào)用File類方法
###3. File 類成員方法
—?jiǎng)?chuàng)建功能—
public boolean createNewFile():創(chuàng)建文件,如果文件已存在,不再創(chuàng)建
public boolean mkdir():創(chuàng)建單級(jí)文件夾,如果文件夾已存在,不再創(chuàng)建
public boolean mkdirs():創(chuàng)建多級(jí)文件夾,文件夾已經(jīng)存在了,不在創(chuàng)建
mkdirs() 也可以創(chuàng)建單級(jí)文件夾,所以推薦使用 mkdirs()
—?jiǎng)h除功能—
public boolean delete(): 刪除文件或者文件夾,不走回收站,直接從硬盤(pán)刪除!
如果此路徑名表示一個(gè)目錄,則該目錄 必須為空 才能刪除。
—重命名功能—
public boolean renameTo(File dest): 重新命名文件
—判斷功能—
public boolean isFile() :判斷File構(gòu)造方法中封裝的路徑是不是文件
public boolean isDirectory():判斷File構(gòu)造方法中封裝的路徑是不是文件夾
public boolean exists(): 判斷File構(gòu)造方法中封裝的路徑是否存在
public boolean canRead() :讀權(quán)限
public boolean canWrite() :寫(xiě)權(quán)限
public boolean isHidden() :是否隱藏
—基本獲取功能—
public String getAbsolutePath():獲取絕對(duì)路徑,返回 String 對(duì)象
public File getAbsoluteFile():獲取絕對(duì)路徑,返回 file 對(duì)象(推薦使用)
eclipse和 IDEA環(huán)境中,寫(xiě)一個(gè)相對(duì)路徑,獲取的絕對(duì)位置是工程根目錄
public String getPath():將抽象路徑名轉(zhuǎn)換為字符串(就相當(dāng)于 toString)
public String getName():返回路徑中表示的文件名或者文件夾名 (獲取路徑中的最后部分的名字)
public long length() :返回路徑中表示的文件的字節(jié)數(shù)(文件夾為 0)
public long lastModified() :上次修改的時(shí)間
String getParent(): 獲取父路徑,返回String對(duì)象
File getParentFile(): 獲取父路徑,返回File對(duì)象(推薦使用)
###4. File類高級(jí)獲取功能
public String[] list()
獲取到 File 構(gòu)造方法中封裝的路徑中的文件和文件夾名 (遍歷一個(gè)目錄),返回只有名字
如果此抽象路徑名不表示一個(gè)目錄,那么此方法將返回 null
返回的是一個(gè)字符串?dāng)?shù)組
不會(huì)遞歸的獲取子目錄中的信息(文件或者目錄的名稱)
public File[] listFiles()
獲取到 File 構(gòu)造方法中封裝的路徑中的文件和文件夾名 (遍歷一個(gè)目錄),返回的是目錄或者文件的 全路徑
返回一個(gè) File對(duì)象數(shù)組
不會(huì)遞歸的獲取子目錄中的信息(文件或者目錄的名稱)
注意:在獲取指定目錄下的文件或者文件夾時(shí)必須滿足下面兩個(gè)條件
1,指定的目錄必須存在
2,指定的必須是目錄。否則容易引發(fā) 返回?cái)?shù)組為null,出現(xiàn)NullPointerException
###5. 文件過(guò)濾器
listFiles(FileFilter filter) : 傳遞 FileFilter 接口的實(shí)現(xiàn)類
FileFilter 接口:
必須自定義 FileFilter 接口實(shí)現(xiàn)類,重寫(xiě)抽象方法,然后將接口實(shí)現(xiàn)類對(duì)象傳遞到遍歷方法 listFiles
boolean accept(File pathname) 返回 true 滿足條件,回false不滿足過(guò)濾條件
過(guò)濾器中的 accept() 方法接受一個(gè)參數(shù),這個(gè)參數(shù)就當(dāng)前文件或文件夾對(duì)象(全路徑)
FilenameFilter接口:
過(guò)濾器中的 accept() 接受兩個(gè)參數(shù),一個(gè)當(dāng)前文件或文件夾所在的路徑,一個(gè)是當(dāng)前文件或文件夾對(duì)象的名稱
boolean accept(File dir, String name) 返回true滿足條件,回false不滿足過(guò)濾條件
當(dāng)我們需要過(guò)濾文件名稱時(shí)就可以使用 FilenameFilter 這個(gè)過(guò)濾器,當(dāng)我們想對(duì)當(dāng)前文件或文件夾進(jìn)行過(guò)濾,就可以使用 FileFilter
對(duì)于一個(gè)目錄下,文件或文件目錄的篩選工作代碼:
不變——篩選過(guò)程
變化——篩選條件
原理分析
listFiles() 遍歷目錄的同時(shí),獲取到了文件名全路徑,調(diào)用過(guò)濾器的方法 accept(),將獲取到的路徑傳遞給 accept(),accept() 方法接收了參數(shù),參數(shù)是 listFiles 傳遞來(lái)的,在 accept()方法中,進(jìn)行判斷,如果滿足過(guò)濾條件,返回true,否則返回false,一旦方法返回了true,listFiles 就將路徑保存到 File數(shù)組 中
###6. 遞歸遍歷全目錄
##二、IO流
###1. 概述
IO流用來(lái)處理設(shè)備之間的 數(shù)據(jù)傳輸
Java對(duì)數(shù)據(jù)的操作是通過(guò) 流 的方式
Java用于操作流的對(duì)象都在 IO包 中(input/output)
Output操作:把內(nèi)存中的數(shù)據(jù)存儲(chǔ)到持久化設(shè)備上這個(gè)動(dòng)作稱為輸出(寫(xiě))
Input操作:把持久設(shè)備上的數(shù)據(jù)讀取到內(nèi)存中的這個(gè)動(dòng)作稱為輸入(讀)
流的分類:
流按流向分為兩種:
輸出流:內(nèi)存——>外設(shè)(寫(xiě)出數(shù)據(jù))
輸入流:磁盤(pán)——>內(nèi)存(讀入數(shù)據(jù))
流按操作類型分為兩種:
字節(jié)流:字節(jié)流可以操作任何數(shù)據(jù),因?yàn)樵谟?jì)算機(jī)中任何數(shù)據(jù)都是以字節(jié)的形式存儲(chǔ)的
字符流:字符流只能操作純字符數(shù)據(jù),比較方便。
###2. IO流常用父類
字節(jié)流的抽象父類:InputStream ,OutputStream
字符流的抽象父類:Reader , Writer
##三、字節(jié)輸出流
###1. 概述
java.io.OutputStream 此抽象類,是表示輸出字節(jié)流的所有類的超類。操作的數(shù)據(jù)都是 字節(jié)
##2. OutputStream 的核心方法:
void close(): 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。
close的常規(guī)協(xié)定:該方法將關(guān)閉輸出流。關(guān)閉的流不能執(zhí)行輸出操作,也不能重新打開(kāi)。
如果流對(duì)象建立失敗了,需要關(guān)閉資源嗎?
new 對(duì)象的時(shí)候,失敗了,沒(méi)有占用系統(tǒng)資源;釋放資源的時(shí)候,對(duì)流對(duì)象判斷null,變量不是null,對(duì)象建立成功,需要關(guān)閉資源
write(byte[] b): 將 b.length 個(gè)字節(jié)從指定的 byte 數(shù)組寫(xiě)入此輸出流
write(byte[] b, int off, int len):將指定 byte 數(shù)組中從偏移量 off 開(kāi)始的 len 個(gè)字節(jié)寫(xiě)入此輸出流。
write(int b): 將指定的字節(jié)寫(xiě)入此輸出流。write 的常規(guī)協(xié)定:向輸出流寫(xiě)入一個(gè)字節(jié)。要寫(xiě)入的字節(jié)是參數(shù) b 的八個(gè)低位。b 的 24 個(gè)高位將被忽略。
###3. FileOutputStream 類
####(1) 構(gòu)造方法
FileOutputStream(File file) :創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流。
FileOutputStream(File file, boolean append): 創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫(xiě)入數(shù)據(jù)的文件輸出流,以追加的方式寫(xiě)入。
FileOutputStream(String name) :創(chuàng)建一個(gè)向具有指定名稱的文件中寫(xiě)入數(shù)據(jù)的輸出文件流。
FileOutputStream(String name, boolean append) :創(chuàng)建一個(gè)向具有指定 name 的文件中寫(xiě)入數(shù)據(jù)的輸出文件流,以追加的方式寫(xiě)入。
####(2) 流對(duì)象的使用步驟:
創(chuàng)建流子類的對(duì)象,綁定數(shù)據(jù)目的
調(diào)用流對(duì)象的方法write寫(xiě)
close釋放資源
注意事項(xiàng):流對(duì)象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋
###4. 文件的續(xù)寫(xiě)和換行
####(1)實(shí)現(xiàn)數(shù)據(jù)的換行
在文件中,寫(xiě)入換行符號(hào)換行: \r\n
\r\n 可以寫(xiě)在上一行的末尾, 也可以寫(xiě)在下一行的開(kāi)頭
####(2)關(guān)于數(shù)據(jù)的追加寫(xiě)入
默認(rèn)情況下,當(dāng)一個(gè)文件輸出流對(duì)象,指向一個(gè)文件的時(shí)候,會(huì)清空文件內(nèi)容
必須使用特殊的構(gòu)造方法實(shí)現(xiàn)文件的追加寫(xiě)入,FileOutputStream構(gòu)造方法, 的第二個(gè)參數(shù)中加入 true
//實(shí)現(xiàn)追加寫(xiě)入:
###5. IO異常的處理
一些細(xì)節(jié):
保證流對(duì)象變量,作用域足夠
catch里面處理異常
輸出異常的信息,目的看到哪里出現(xiàn)了問(wèn)題,停下程序,從新嘗試
如果流對(duì)象建立失敗了,需要關(guān)閉資源嗎
new 對(duì)象的時(shí)候,失敗了,沒(méi)有占用系統(tǒng)資源;釋放資源的時(shí)候,對(duì)流對(duì)象判斷 null;變量不是 null,對(duì)象建立成功,需要關(guān)閉資源
##四、字節(jié)輸入流
###1. 概述
java.io.InputStream: 此抽象類是表示字節(jié)輸入流的所有類的超類。讀取任意文件,每次只讀取1個(gè)字節(jié)
###2. 核心方法
abstract int read():讀取一個(gè)字節(jié)
read()方法的特點(diǎn):read() 執(zhí)行一次,就會(huì)自動(dòng)讀取下一個(gè)字節(jié),返回值是讀取到的字節(jié), 讀取到結(jié)尾返回 -1
int read(byte[] b):讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組 b 中
int read(byte[] b, int off, int len) :讀取最多 len 個(gè)字節(jié),存入 byte 數(shù)組。
數(shù)組的作用:緩沖的作用, 提高效率
read 返回的 int,表示讀取到多少個(gè)有效的字節(jié)數(shù)
###3. FileInputStream 類
####(1)構(gòu)造方法
為這個(gè)流對(duì)象 綁定數(shù)據(jù)源
FileInputStream(File file)
FileInputStream(String name)
參數(shù):File對(duì)象 和 String對(duì)象
####(2)輸入流讀取文件的步驟
創(chuàng)建字節(jié)輸入流的子類對(duì)象
調(diào)用讀取方法 read 讀取
關(guān)閉資源
####(3)讀取數(shù)據(jù)的方式:
第一種方式:一次讀取一個(gè)字節(jié)數(shù)據(jù)
第二種方式:一次讀取一個(gè)字節(jié)數(shù)組
第二種方式效率更高,每次讀取都會(huì)和操作系統(tǒng)發(fā)生一次交互,第二種方式每次可以讀取多個(gè)數(shù)據(jù),提高了操作效率
####4、釋放資源的另一種方式
##五、字節(jié)流文件復(fù)制
###1. 讀取單個(gè)字節(jié)
###2. 讀取字節(jié)數(shù)組
public class Copy_1 {public static void main(String[] args) {long s = System.currentTimeMillis();FileInputStream fis = null;FileOutputStream fos = null;try{fis = new FileInputStream("D:\\test.mp3");fos = new FileOutputStream("E:\\test.mp3");//定義字節(jié)數(shù)組,緩沖byte[] bytes = new byte[1024*10];//讀取數(shù)組,寫(xiě)入數(shù)組int len = 0 ;while((len = fis.read(bytes))!=-1){fos.write(bytes, 0, len);}}catch(IOException e){System.out.println(e);throw new RuntimeException("文件復(fù)制失敗");}finally{try{if(fos!=null)fos.close();}catch(IOException e){throw new RuntimeException("釋放資源失敗");}finally{try{if(fis!=null)fis.close();}catch(IOException e){throw new RuntimeException("釋放資源失敗");}}}long e = System.currentTimeMillis();System.out.println(e-s);} } //耗時(shí):41##六、字符輸出流
###1. 概述
java.io.Writer 所有字符輸出流的超類。寫(xiě)文件,寫(xiě) 文本文件
###2. 方法介紹
void write(int c):寫(xiě)入單個(gè)字符
void write(String str) :寫(xiě)入字符串
void write(String str, int off, int len):寫(xiě)入字符串的某一部分
void write(char[] cbuf):寫(xiě)入字符數(shù)組
abstract void write(char[] cbuf, int off, int len) :寫(xiě)入字符數(shù)組的某一部分
###3. FileWriter 類
Writer 類是抽象類,找到子類對(duì)象 FileWriter
構(gòu)造方法:參數(shù)也是 File 類型對(duì)象 和 String 文件名
字符輸出流,寫(xiě)數(shù)據(jù)的時(shí)候,必須要運(yùn)行一個(gè)功能,刷新功能:flush()
##七、字符輸入流
###1. 概述
java.io.Reader,字符輸入流讀取文本文件,所有字符輸入流的超類,專門(mén)讀取文本文件
###2. 方法介紹
int read(): 讀取單個(gè)字符
int read(char[] cbuf):將字符讀入數(shù)組
abstract int read(char[] cbuf, int off, int len) :將字符讀入數(shù)組的某一部分
沒(méi)有讀取字符串的方法
###3. FileReader 類
Reader類 是抽象類,找到子類對(duì)象 FileReader
構(gòu)造方法:寫(xiě)入的數(shù)據(jù)目的。綁定數(shù)據(jù)源。參數(shù)也是 File 類型對(duì)象 和 String 文件名
###4. flush 方法和 close 方法區(qū)別
flush()方法:用來(lái)刷新緩沖區(qū)的,刷新后可以再次寫(xiě)出,只有字符流才需要刷新
close()方法:用來(lái)關(guān)閉流釋放資源的的,如果是帶緩沖區(qū)的流對(duì)象的close()方法,不但會(huì)關(guān)閉流,還會(huì)再關(guān)閉流之前刷新緩沖區(qū),關(guān)閉后不能再寫(xiě)出
##八、字符流復(fù)制文本文件
字符流復(fù)制文本文件,必須是文本文件
字符流查詢本機(jī)默認(rèn)的編碼表,簡(jiǎn)體中文GBK
FileReader 讀取數(shù)據(jù)源
FileWriter 寫(xiě)入到數(shù)據(jù)目的
總結(jié)
以上是生活随笔為你收集整理的Java-进阶:Java-File--IO—1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 康佳电视怎么投屏?
- 下一篇: Java-进阶:Java-File--I