File


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);
            }
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM