JDK(java官方)内置對象-進階-File
1.為什麼要學習File
講解IO流之前為什麼先講解異常和File類呢?
因為File表示的是IO流将來要操作的檔案,是以我們需要學習File類。
而操作檔案無非就是上傳檔案和下載下傳檔案,在這個操作的過程中可能出現問題,出現問題後,我們需要對對應的代碼進行處理。是以我們需要學習異常。
2.File簡介
2.1.File的概念
檔案和目錄路徑名的抽象表示形式
2.2.File常見成員
2.2.1.構造方法
publicFile(String pathname)
publicFile(String parent,String child)
publicFile(File parent,String child)
通過建立對象後,我們再來了解檔案和目錄路徑名的抽象表示形式這句話的意思:
僅僅是一個路徑的表示,不代碼具體的事物一定是存在的。
代碼實戰:
2.2.2.常見方法
2.2.2.1.建立功能
public boolean createNewFile() 建立檔案如果存在這樣的檔案,就不建立了
public boolean mkdir() 建立檔案夾如果存在這樣的檔案夾,就不建立了
public boolean mkdirs() 建立檔案夾,如果父檔案夾不存在,會幫你建立出來,如果存在就不建立了
2.2.2.1.1. mkdir()
代碼實戰:
publicclass Demo1 {
【思考】:既然傳回值是boolean,那麼本地磁盤上已經存在了這個檔案夾,到底傳回true還是false呢?
2.2.2.1.2. createNewFile()
代碼實戰:
【思考】:為何會報錯呢?
觀察源碼
【思考】:這個方法如果再執行一次,效果會怎麼樣呢?
傳回false
【思考題】:請在d盤的test目錄下建立一個b.txt檔案
【思考題】:我想要在d盤的aaa檔案夾下建立一個bbb檔案夾,怎麼做呢?
代碼實戰:
【接着思考】:為何不會抛出異常呢?
【正确做法】:
【接着思考】:如果有很多層級結構的檔案夾,這樣子操作顯然是非常不合适的
這時候,我們就迫切需要一個方法幫我們去處理這種情況,可以使用:Mkdirs()
【開發總結】:
- 你到底要建立檔案還是檔案夾,你最清楚,方法不要調錯了。
- 如果想要建立一個子檔案/檔案夾,前提必須要保證該檔案對應的檔案目錄首先要存在
【注意點】:如果你在建立檔案的時候,你沒有寫任何目錄路徑,那麼會怎麼樣呢?
代碼實戰:
建立出來的檔案存在于: E:\yueqian講課\01-java基礎\0830\備課代碼\02-File\女神.jpg
你目前項目所在的目錄下[U1] !!!!
2.2.2.2.删除功能
public boolean delete()
2.2.2.2.1.删除單個檔案
如果删除的是本地硬碟中檔案,那麼會直接删除并且不走資源回收筒!
File file = new File("d:\\a.txt"); System.out.println(file.delete()); |
---|
如果删除的是本地項目中檔案,删除完後,需要手動重新整理一下
2.2.2.2.2.删除檔案夾
删除bbb檔案夾
// 删除bbb檔案夾 File file11 = new File("e:\\aaa\\bbb"); booleanb = file11.delete(); System.out.println(b); |
---|
注意:在java中删除操作,不走資源回收筒,是以請一定要注意!!!
删除aaa檔案夾
File file= new File("d:\\aa\\bb"); file.delete();[n2] File fle = new File("d:\\aa");[n3] fle.delete(); |
---|
因為aaa中有檔案夾bbb,如果想要删除aaa檔案夾,必須先删除bbb檔案夾
下面代碼為何會出錯呢?因為這樣子寫,是代表在項目的根目錄下删除[n4]
2.2.2.3.重命名功能
public boolean renameTo(File file)[n5]
代碼實戰:
磁盤上
File file = new File("D:\\校服美女.jpg"); File file2 = new File("D:\\女神.jpg"); System.out.println(file.renameTo(file2)); |
---|
目前項目下
【思考】:如果在進行重命名操作的時候,路徑不一緻會怎麼樣呢?
代碼實戰:
其實是做了一個剪切操作[n6]
【開發小結】:
如果路徑一緻,那麼僅僅就是改個名字。
如果路徑不一緻,那麼不僅僅是改個名字,還會剪切。
2.2.2.4.判斷功能
public booleanisDirectory() 判斷是否是目錄
public boolean isFile() 判斷是否是檔案
public booleanexists() 判斷是否存在
public boolean canRead() 判斷是否可讀
public boolean canWrite() 判斷是否可寫
public boolean isHidden() 判斷是否隐藏
檔案的狀态介紹
- 隐藏
- 可讀
- 可寫
- 可讀可寫
Windows 系統設定檔案的狀态
代碼實戰:
思考:File檔案對象具體有哪些使用場景呢?
.2.2.5.擷取功能
2.2.2.5.1.基本擷取功能
• public String getAbsolutePath() 擷取絕對路徑[n7]
• public String getPath() 擷取相對路徑[n8]
思考:以後開發中,會使用哪種路徑方式?
• public String getName() 擷取名稱
• public long length() 擷取長度(位元組長度)
容量的機關從小到大依次是:位元組(B)、KB、MB、GB、TB。它們之間的關系是。
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024位元組
代碼實戰:
• public long lastModified() (擷取最後一次修改時間)
System.out.println("最後修改時間:"+file.lastModified()); |
---|
觀察列印:
最後修改時間:1550292558058
思考:為何是這樣子呢?[n9]
将毫秒數進行轉換
Date date =new Date(file.lastModified()); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sd.format(date); System.out.println("dateStr:"+dateStr); |
---|
觀察列印結果:
2.2.2.5.2.進階擷取功能
public String[] list() 擷取指定目錄下的所有檔案或者檔案夾的名稱數組
擷取目前項目下的所有
思考:如何擷取目前盤符下的所有呢?
public File[] listFiles() 擷取指定目錄下的所有檔案或者檔案夾的File數組
觀察列印效果:
思考:如何我想像上面一樣,僅僅是擷取到檔案名稱呢?[n10]
思考:以後開發中,我們到底應該使用哪一種方式比較好呢?[n11]
3.File作業練習題
【練習題】:
判斷E盤目錄下是否有字尾名為.jpg的檔案,如果有,就輸出此檔案名稱,如果沒有,給出提示!!
批量修改多個檔案名稱
[U1]在項目上右鍵重新整理即可
或者去項目的目錄下找
[n2]先删除bb
[n3]先删除aa
[n4]因為不加任何路徑,預設就是删除目前項目目錄下的東西
[n5]思考為何重命名方法的參數是File 類型?
[n6]重新整理一下
[n7]擷取的是完整路徑名,從盤符開始
[n8]相對來擷取的,參照物是盤符
[n9]是以毫秒數進行計算的
[n10]思路1:截取字元串
思路2:使用File.getName()方法
[n11]第二種方式比較好,因為傳回的是File對象,有對象,就可以使用對象操作一些方法擷取更多的資訊