File
思考:我們可以對硬盤進行哪些操作?
讀、寫
IO就可以對硬盤中的文件進行讀寫
1.可以將數據從本地文件中讀出來
2.可以將數據從內存保存到本地文件
File表示要讀寫的文件在哪兒,也可以對文件進行創建、刪除等操作
1.在讀寫數據時告訴虛擬機要操作的(文件/文件夾)在哪兒
2.對(文件/文件夾)本身進行操作,包括創建、刪除等等
File類
File類介紹
-
它是文件和目錄路徑名的抽象表示
-
文件和目錄是可以通過File封裝成對象的
-
對於File而言,其封裝的並不是一個真正存在的文件,僅僅是一個路徑名而已.它可以是存在的,也可以是不存在的.將來是要通過具體的操作把這個路徑的內容轉換為具體存在的
-
File類的構造方法
方法名 說明 File(String pathname) 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例 File(String parent, String child) 從父路徑名字符串和子路徑名字符串創建新的 File實例 File(File parent, String child) 從父抽象路徑名和子路徑名字符串創建新的 File實例 -
示例代碼
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/11 22:26
*/
public class FileDemo1 {
public static void main(String[] args) {
method1();
method2();
method3();
}
private static void method3() {
//File(File parent, String child): 從父抽象路徑名和子路徑名字符串創建新的 File實例
File file1 = new File("F:\\itheima");
String document = "a.txt";
File file = new File(file1,document);
System.out.println(file);
}
private static void method2() {
//File(String parent, String child): 從父路徑名字符串和子路徑名字符串創建新的 File實例
String path = "F:\\itheima";
String document = "a.txt";
File file = new File(path,document);
System.out.println(file);
//F:\itheima\a.txt
}
private static void method1() {
//File(String pathname): 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例
String path = "F:\\itheima\\a.txt";
File file = new File(path);
//問題:為什么要把字符串形式表示的路徑變成File對象?
//就是為了使用File類里面的方法
System.out.println(file);
//F:\itheima\a.txt
}
}
絕對路徑和相對路徑
-
絕對路徑
是一個完整的路徑,從盤符開始
File file = new File("F:\\itheima\\a.txt");
-
相對路徑
是一個簡化的路徑,相對當前項目下的路徑
File file1 = new File("a.txt"); File file2 = new File("模塊名\\a.txt");
File類創建功能【應用】
創建方法
-
方法分類
方法名 說明 public boolean createNewFile() 當具有該名稱的文件不存在時,創建一個由該抽象路徑名命名的新空文件 public boolean mkdir() 創建由此抽象路徑名命名的目錄 public boolean mkdirs() 創建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄 -
示例代碼
package com.cloudcore.filetest;
import java.io.File;
import java.io.IOException;
/**
* @Author: hepeng
* @Date: 2021/10/11 22:47
*/
public class FileDemo3 {
public static void main(String[] args) throws IOException {
//public boolean createNewFile() 創建一個新的空的文件
method1();
//public boolean mkdir() 創建一個單級文件夾
method2();
//public boolean mkdirs() 創建多級文件夾
method3();
}
private static void method3() {
//public boolean mkdirs() 創建多級文件夾
File file = new File("F:\\itheima\\ccc\\ddd\\hhh");
boolean mkdirs = file.mkdirs();
System.out.println(mkdirs);
//注意點:
//1.可以創建單級文件夾也可以創建多級文件夾
//2.不管調用者有沒有后綴,只能創建文件夾
}
private static void method2() {
//public boolean mkdir() 創建一個單級文件夾
File file = new File("F:\\itheima\\aaa");
boolean result = file.mkdir();
System.out.println(result);
//注意點:
//1.只能創建單級文件夾,不能創建多級文件夾
//2.不管調用者有沒有后綴,只能創建文件夾
}
private static void method1() throws IOException {
//public boolean createNewFile() 創建一個新的空的文件
File file = new File("F:\\itheima\\a.txt");
boolean result = file.createNewFile();
System.out.println(result);
//注意點:
//1.如果文件存在,創建失敗返回false
//2.如果文件不存在,創建成功,返回true
//3.createNewFile不管調用者有沒有后綴只能創建文件
}
}
疑問
既然mkdirs既可以創建單級文件夾也可以創建多級文件夾,那么還要mkdir有何用?
是的,以后直接使用mkdirs
刪除方法
-
方法分類
方法名 說明 public boolean delete() 刪除由此抽象路徑名表示的文件或目錄 -
示例代碼
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/11 23:01
*/
public class FileDemo4 {
public static void main(String[] args) {
//public boolean delete()
method1();
//注意點:
//1.用delete刪除是不走回收站的
//2.可以刪除文件或者文件夾
//3.如果刪除的是文件,那么直接刪除
// 如果刪除的是文件夾,只能刪除空文件夾
//4.如果想要刪除一個有內容的文件夾,只能先進入到這個文件夾,把里面內容全部刪除完畢,才能再次刪除這個文件夾
File file = new File("F:\\itheima\\aaa");
boolean result = file.delete();
System.out.println(result);
}
private static void method1() {
//public boolean delete()
File file = new File("F:\\itheima\\a.txt");
boolean result = file.delete();
System.out.println(result);
}
}
File類判斷和獲取功能
-
判斷功能
方法名 說明 public boolean isDirectory() 測試此抽象路徑名表示的File是否為目錄 public boolean isFile() 測試此抽象路徑名表示的File是否為文件 public boolean exists() 測試此抽象路徑名表示的File是否存在 -
獲取功能
方法名 說明 public String getAbsolutePath() 返回此抽象路徑名的絕對路徑名字符串 public String getPath() 將此抽象路徑名轉換為路徑名字符串 public String getName() 返回由此抽象路徑名表示的文件或目錄的名稱 public File[] listFiles() 返回此抽象路徑名表示的目錄中的文件和目錄的File對象數組 -
示例代碼
package com.cloudcore.filetest;
import java.io.File;
/**
* @Author: hepeng
* @Date: 2021/10/12 20:34
*/
public class FileDemo5 {
public static void main(String[] args) {
//public boolean isDirectory() 判斷是否為目錄
//public boolean isFile() 判斷是否為文件
method1();
//public boolean exists() 判斷file是否存在
method2();
//public String getName() 返回由此抽象路徑名表示的文件或目錄的名稱
//注意點:
//1.如果調用者是文件,那么獲取的是文件名和后綴名
//2.如果調用者是一個文件夾,那么獲取的是問價夾的名稱
File file = new File("a.txt");
String name = file.getName();
System.out.println(name);//a.txt
File files = new File("F:\\itheima");
String name1 = files.getName();
System.out.println(name1);//itheima
}
private static void method2() {
//當前項目下的a.txt
File file = new File("a.txt");
boolean result = file.exists();
System.out.println(result);
}
private static void method1() {
File file = new File("F:\\itheima\\a.txt");
boolean directory = file.isDirectory();
boolean files = file.isFile();
System.out.println(directory);//false
System.out.println(files);//true
}
}
listFiles()
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("D:\\");
File[] files = file.listFiles();
for (File path : files) {
System.out.println(path);
}
//進入文件夾,獲取這個文件夾里面所有的問價和文件夾的File對象,並把這些File對象都放在一個數組中返回
//包括隱藏問價和隱藏文件夾都可以獲取
//注意事項
//1.當調用者是一個文件時,返回一個null
//2.當調用者是一個空文件夾時,會返回一個長度為0的數組
//3.當調用者是一個有內容的文件夾時,會進入這個文件夾獲取里面所有的文件
//4.當調用者是一個有權限才能進入的文件夾時,也會返回null
}
}
小練習
練習一:在當前模塊下的aaa文件夾中創建一個a.txt文件
public class FileTest1 {
public static void main(String[] args) throws IOException {
//練習一:在當前模塊下的aaa文件夾中創建一個a.txt文件
//注意點:
//文件所在的文件夾必須要存在,否則就會報錯
File file = new File("file_io\\aaa");
if (!file.exists()){
//如果文件夾不存在我們就創建
file.mkdirs();
}
File newFile = new File(file,"a.txt");
newFile.createNewFile();
}
}
練習二:刪除一個多級文件夾
-
案例需求
刪除一個多級文件夾
-
實現步驟
- 定義一個方法,接收一個File對象
- 遍歷這個File對象,獲取它下邊的每個文件和文件夾對象
- 判斷當前遍歷到的File對象是文件還是文件夾
- 如果是文件,直接刪除
- 如果是文件夾,遞歸調用自己,將當前遍歷到的File對象當做參數傳遞
- 參數傳遞過來的文件夾File對象已經處理完成,最后直接刪除這個空文件夾
-
代碼實現
public class FileTest2 {
public static void main(String[] args) {
//練習二:刪除一個多級文件夾
File src = new File("F:\\itheima\\ccc\\ddd\\hhh");
deleteDir(src);
}
private static void deleteDir(File src) {
//先刪除所有內容
//遞歸 方法在方法體中自己調用自己
//1.進入
File[] files = src.listFiles();
//2.遍歷
for (File file : files) {
if(file.isFile()){
//3.判斷 如果遍歷到的是一個文件直接刪除
file.delete();
}else {
//4.判斷 如果是文件夾遞歸
deleteDir(file);
}
}
//最后再刪除這個文件夾
src.delete();
}
}
練習三:統計一個文件夾中,每種文件出現的次數.
-
案例需求
統計一個文件夾中每種文件的個數並打印
打印格式如下:
txt:3個 doc:4個 jpg:6個 …
-
實現步驟
- 定義一個方法,參數是HashMap集合用來統計次數和File對象要統計的文件夾
- 遍歷File對象,獲取它下邊的每一個文件和文件夾對象
- 判斷當前File對象是文件還是文件夾
- 如果是文件,判斷這種類型文件后綴名在HashMap集合中是否出現過
- 沒出現過,將這種類型文件的后綴名存入集合中,次數存1
- 出現過,獲取這種類型文件的后綴名出現的次數,對其+1,在存回集合中
- 如果是文件夾,遞歸調用自己,HashMap集合就是參數集合,File對象是當前文件夾對象
-
代碼實現
public class Test3 {
public static void main(String[] args) {
//統計一個文件夾中,每種文件出現的次數.
//統計 --- 定義一個變量用來統計. ---- 弊端:同時只能統計一種文件
//利用map集合進行數據統計,鍵 --- 文件后綴名 值 ---- 次數
File file = new File("filemodule");
HashMap<String, Integer> hm = new HashMap<>();
getCount(hm, file);
System.out.println(hm);
}
//1.定義一個方法,參數是HashMap集合用來統計次數和File對象要統計的文件夾
private static void getCount(HashMap<String, Integer> hm, File file) {
//2.遍歷File對象,獲取它下邊的每一個文件和文件夾對象
File[] files = file.listFiles();
for (File f : files) {
//3.判斷當前File對象是文件還是文件夾
if(f.isFile()){
//如果是文件,判斷這種類型文件后綴名在HashMap集合中是否出現過
String fileName = f.getName();
String[] fileNameArr = fileName.split("\\.");
if(fileNameArr.length == 2){
String fileEndName = fileNameArr[1];
if(hm.containsKey(fileEndName)){
//出現過,獲取這種類型文件的后綴名出現的次數,對其+1,在存回集合中
Integer count = hm.get(fileEndName);
//這種文件又出現了一次.
count++;
//把已經出現的次數給覆蓋掉.
hm.put(fileEndName,count);
}else{
// 沒出現過,將這種類型文件的后綴名存入集合中,次數存1
hm.put(fileEndName,1);
}
}
}else{
//如果是文件夾,遞歸調用自己,HashMap集合就是參數集合,File對象是當前文件夾對象代碼實現
getCount(hm,f);
}
}
}
}