1. 程式人生 > 實用技巧 >java:File類

java:File類

第一章 File類

1.1 概述

java.io.File 類是檔案和目錄路徑名的抽象表示,主要用於檔案和目錄的建立、查詢和刪除等操作。

1.2 構造方法

  public File(String pathname) ` :通過將給定的**路徑名字串**轉換為抽象路徑名來建立新的 File例項。

  public File(String parent, String child) ` :從**父路徑名字串和子路徑名字串**建立新的 File例項。
  public File(File parent, String child)` :從**父抽象路徑名和子路徑名字串**建立新的 File例項。

java.io.File類


  檔案和目錄路徑名的抽象表示形式。
  java把電腦中的檔案和資料夾(目錄)封裝為了一個File類,
  我們可以使用File類對檔案和資料夾進行操作
  我們可以使用File類的方法
    建立一個檔案/資料夾
    刪除檔案/資料夾
    獲取檔案/資料夾
    判斷檔案/資料夾是否存在
  對資料夾進行遍歷
  獲取檔案的大小
  File類是一個與系統無關的類,任何的作業系統都可以使用這個類中的方法

  重點:記住這三個單詞
    file:檔案


    directory:資料夾/目錄
    path:路徑

public class Demo01File {
    public static void main(String[] args) {
        /*
            static String pathSeparator 與系統有關的路徑分隔符,為了方便,
                    它被表示為一個字串。
            static char pathSeparatorChar 與系統有關的路徑分隔符。

            static String separator 與系統有關的預設名稱分隔符,
                    為了方便,它被表示為一個字串。
            static char separatorChar 與系統有關的預設名稱分隔符。

            操作路徑:路徑不能寫死了
            C:\develop\a\a.txt  windows
            C:/develop/a/a.txt  linux
            "C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"
         
*/ String pathSeparator = File.pathSeparator; System.out.println(pathSeparator);//路徑分隔符 windows:分號; linux:冒號: String separator = File.separator; System.out.println(separator);// 檔名稱分隔符 windows:反斜槓\ linux:正斜槓/ } }
View Code
 @Test
    public void FileTestDemo1(){
        String pathSeparator=File.pathSeparator;
        System.out.println(pathSeparator);//路徑分隔符 windows:分號;  linux:冒號:
        String separator = File.separator;
        System.out.println(separator);// 檔名稱分隔符 windows:反斜槓\  linux:正斜槓/
        File f=new File("D:\\workplace\\java\\idea\\Test1");
        long length=f.length();
        System.out.println(length);

    }
View Code

> 1. 一個File物件代表硬碟中實際存在的一個檔案或者目錄。
> 2. 無論該路徑下是否存在檔案或者目錄,都不影響File物件的建立。

1.3 常用方法

  獲取功能的方法

  public String getAbsolutePath() ` :返回此File的絕對路徑名字串。

  public String getPath() ` :將此File轉換為路徑名字串。

  public String getName()` :返回由此File表示的檔案或目錄的名稱。

  public long length()` :返回由此File表示的檔案的長度。

路徑:
絕對路徑:是一個完整的路徑
  以碟符(c:,D:)開始的路徑
  c:\\a.txt
  C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt
  D:\\demo\\b.txt
  相對路徑:是一個簡化的路徑
    相對指的是相對於當前專案的根目錄(C:\\Users\itcast\\IdeaProjects\\shungyuan)
  如果使用當前專案的根目錄,路徑可以簡化書寫
  C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt-->簡化為: 123.txt(可以省略專案的根目錄)
  注意:
    1.路徑是不區分大小寫
    2.路徑中的檔名稱分隔符windows使用反斜槓,反斜槓是轉義字元,兩個反斜槓代表一個普通的

public String getAbsolutePath() :返回此File的絕對路徑名字串。
獲取的構造方法中傳遞的路徑
無論路徑是絕對的還是相對的,getAbsolutePath方法返回的都是絕對路徑
/*
        public String getAbsolutePath() :返回此File的絕對路徑名字串。
        獲取的構造方法中傳遞的路徑
        無論路徑是絕對的還是相對的,getAbsolutePath方法返回的都是絕對路徑
     */
    @Test
    public void FileTestDemo4(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\a.txt");
        String absolutePath1 = f1.getAbsolutePath();
        System.out.println(absolutePath1);

        File f2 = new File("a.txt");
        String absolutePath2 = f2.getAbsolutePath();
        System.out.println(absolutePath2);
        /*
        * D:\workplace\java\idea\Test1\a.txt
          D:\workplace\java\idea\Test1\a.txt
          * 由於是絕對路徑所以...
        * */
    }
View Code

public String getPath() :將此File轉換為路徑名字串。
獲取的構造方法中傳遞的路徑
toString方法呼叫的就是getPath方法
原始碼:
public String toString() {
return getPath();
}

  /*
        public String getPath() :將此File轉換為路徑名字串。
        獲取的構造方法中傳遞的路徑

        toString方法呼叫的就是getPath方法
        原始碼:
            public String toString() {
                return getPath();
            }
     */
    @Test
    public void FileTestDemo5(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\a.txt");
        File f2 = new File("a.txt");
        System.out.println(f1.getPath());//D:\workplace\java\idea\Test1\a.txt
        System.out.println(f2.getPath());//a.txt
    }
View Code
public String getName()  :返回由此File表示的檔案或目錄的名稱。
獲取的就是構造方法傳遞路徑的結尾部分(檔案/資料夾)
/*
        public String getName()  :返回由此File表示的檔案或目錄的名稱。
        獲取的就是構造方法傳遞路徑的結尾部分(檔案/資料夾)
     */
    @Test
    public void FileTestDemo6(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\a.txt");
        File f2= new File("D:\\workplace\\java\\idea\\Test1");
        System.out.println(f1.getName());//a.txt
        System.out.println(f2.getName());//Test1
    }
View Code

public long length() :返回由此File表示的檔案的長度。

獲取的是構造方法指定的檔案的大小,以位元組為單位
注意:
資料夾是沒有大小概念的,不能獲取資料夾的大小
如果構造方法中給出的路徑不存在,那麼length方法返回0

    /*
        public long length()  :返回由此File表示的檔案的長度。
        獲取的是構造方法指定的檔案的大小,以位元組為單位
        注意:
            資料夾是沒有大小概念的,不能獲取資料夾的大小
            如果構造方法中給出的路徑不存在,那麼length方法返回0
     */
    @Test
    public void FileTestDemo7(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\a.txt");//檔案真實存在
        File f2 = new File("D:\\workplace\\java\\idea\\Test1\\b.txt");//檔案不存在
        System.out.println(f1.length());//不為0
        System.out.println(f2.length());//0
    }
View Code

File類判斷功能的方法
- public boolean exists() :此File表示的檔案或目錄是否實際存在。
- public boolean isDirectory() :此File表示的是否為目錄。
- public boolean isFile() :此File表示的是否為檔案。

    /*
    File類判斷功能的方法
        - public boolean exists() :此File表示的檔案或目錄是否實際存在。
        - public boolean isDirectory() :此File表示的是否為目錄。
        - public boolean isFile() :此File表示的是否為檔案。
 */
    @Test
    public void FileTestDemo8(){
         /*
        public boolean isDirectory() :此File表示的是否為目錄。
            用於判斷構造方法中給定的路徑是否以資料夾結尾
                是:true
                否:false
        public boolean isFile() :此File表示的是否為檔案。
            用於判斷構造方法中給定的路徑是否以檔案結尾
                是:true
                否:false
        注意:
            電腦的硬碟中只有檔案/資料夾,兩個方法是互斥
            這兩個方法使用前提,路徑必須是存在的,否則都返回false
     */
        /*
        public boolean exists() :此File表示的檔案或目錄是否實際存在。
        用於判斷構造方法中的路徑是否存在
            存在:true
            不存在:false
     */
        //本部分可以直接參考原始碼,主要的目的在於判斷是否存在的問題
    }
View Code
import java.io.File;

/*
    File類判斷功能的方法
        - public boolean exists() :此File表示的檔案或目錄是否實際存在。
        - public boolean isDirectory() :此File表示的是否為目錄。
        - public boolean isFile() :此File表示的是否為檔案。
 */
public class Demo04File {
    public static void main(String[] args) {
        show02();
    }

    /*
        public boolean isDirectory() :此File表示的是否為目錄。
            用於判斷構造方法中給定的路徑是否以資料夾結尾
                是:true
                否:false
        public boolean isFile() :此File表示的是否為檔案。
            用於判斷構造方法中給定的路徑是否以檔案結尾
                是:true
                否:false
        注意:
            電腦的硬碟中只有檔案/資料夾,兩個方法是互斥
            這兩個方法使用前提,路徑必須是存在的,否則都返回false
     */
    private static void show02() {
        File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shung");

        //不存在,就沒有必要獲取
        if(f1.exists()){
            System.out.println(f1.isDirectory());
            System.out.println(f1.isFile());
        }

        File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
        if(f2.exists()){
            System.out.println(f2.isDirectory());//true
            System.out.println(f2.isFile());//false
        }

        File f3 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\shungyuan.iml");
        if(f3.exists()){
            System.out.println(f3.isDirectory());//false
            System.out.println(f3.isFile());//true
        }
    }

    /*
        public boolean exists() :此File表示的檔案或目錄是否實際存在。
        用於判斷構造方法中的路徑是否存在
            存在:true
            不存在:false
     */
    private static void show01() {
        File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
        System.out.println(f1.exists());//true

        File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shung");
        System.out.println(f2.exists());//false

        File f3 = new File("shungyuan.iml");//相對路徑 C:\Users\itcast\IdeaProjects\shungyuan\shungyuan.iml
        System.out.println(f3.exists());//true

        File f4 = new File("a.txt");
        System.out.println(f4.exists());//false
    }
}
View Code

File類建立刪除功能的方法
- public boolean createNewFile() :當且僅當具有該名稱的檔案尚不存在時,建立一個新的空檔案。
- public boolean delete() :刪除由此File表示的檔案或目錄。
- public boolean mkdir() :建立由此File表示的目錄。
- public boolean mkdirs() :建立由此File表示的目錄,包括任何必需但不存在的父目錄。

@Test
    public void FileTestDemo9() throws IOException {
        /*
        public boolean createNewFile() :當且僅當具有該名稱的檔案尚不存在時,建立一個新的空檔案。
        建立檔案的路徑和名稱在構造方法中給出(構造方法的引數)
        返回值:布林值
            true:檔案不存在,建立檔案,返回true
            false:檔案存在,不會建立,返回false
        注意:
            1.此方法只能建立檔案,不能建立資料夾
            2.建立檔案的路徑必須存在,否則會丟擲異常

        public boolean createNewFile() throws IOException
        createNewFile宣告丟擲了IOException,我們呼叫這個方法,就必須的處理這個異常,要麼throws,要麼trycatch
     */
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\b.txt");
        boolean b1 = f1.createNewFile();
        System.out.println("b1:"+b1);//true建立成功
    }
     /*
       public boolean mkdir() :建立單級空資料夾
       public boolean mkdirs() :既可以建立單級空資料夾,也可以建立多級資料夾
       建立資料夾的路徑和名稱在構造方法中給出(構造方法的引數)
        返回值:布林值
            true:資料夾不存在,建立資料夾,返回true
            false:資料夾存在,不會建立,返回false;構造方法中給出的路徑不存在返回false
        注意:
            1.此方法只能建立資料夾,不能建立檔案
     */
    @Test
    public void FileTestDemo10(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\11");
        boolean b1 = f1.mkdir();
        System.out.println("b1:"+b1);

        File f2 = new File("D:\\workplace\\java\\idea\\Test1\\11\\22");
        boolean b2 = f2.mkdirs();
        System.out.println("b2:"+b2);
        File f3 = new File("08_FileAndRecursion\\abc.txt");
        boolean b3 = f3.mkdirs();//看型別,是一個檔案
        System.out.println("b3:"+b3);

        File f4 = new File("08_F\\ccc");
        boolean b4 = f4.mkdirs();//不會丟擲異常,路徑不存在,不會建立
        System.out.println("b4:"+b4);
    }

 /*
        public boolean delete() :刪除由此File表示的檔案或目錄。
        此方法,可以刪除構造方法路徑中給出的檔案/資料夾
        返回值:布林值
            true:檔案/資料夾刪除成功,返回true
            false:資料夾中有內容,不會刪除返回false;構造方法中路徑不存在false
        注意:
            delete方法是直接在硬碟刪除檔案/資料夾,不走回收站,刪除要謹慎
     */
    @Test
    public void FileTestDemo11(){
        File f1 = new File("D:\\workplace\\java\\idea\\Test1\\11\\22");
        boolean b1 = f1.delete();
        System.out.println("b1:"+b1);

        File f2 = new File("D:\\workplace\\java\\idea\\Test1\\11");
        System.out.println(f2.delete());
    }
View Code

File類遍歷(資料夾)目錄功能
- public String[] list() :返回一個String陣列,表示該File目錄中的所有子檔案或目錄。
- public File[] listFiles() :返回一個File陣列,表示該File目錄中的所有的子檔案或目錄。

注意:
list方法和listFiles方法遍歷的是構造方法中給出的目錄
如果構造方法中給出的目錄的路徑不存在,會丟擲空指標異常
如果構造方法中給出的路徑不是一個目錄,也會丟擲空指標異常

/*
    File類遍歷(資料夾)目錄功能
        - public String[] list() :返回一個String陣列,表示該File目錄中的所有子檔案或目錄。
        - public File[] listFiles() :返回一個File陣列,表示該File目錄中的所有的子檔案或目錄。

    注意:
        list方法和listFiles方法遍歷的是構造方法中給出的目錄
        如果構造方法中給出的目錄的路徑不存在,會丟擲空指標異常
        如果構造方法中給出的路徑不是一個目錄,也會丟擲空指標異常
 */
    @Test
    public void FileTestDemo12(){
        /*
        public File[] listFiles() :返回一個File陣列,表示該File目錄中的所有的子檔案或目錄。
        遍歷構造方法中給出的目錄,會獲取目錄中所有的檔案/資料夾,把檔案/資料夾封裝為File物件,
            多個File物件儲存到File陣列中
     */
        File file=new File("D:\\workplace\\java\\idea\\Test1");
        File [] files=file.listFiles();
        for(File f:files){
            System.out.println(f);//輸出的是路徑
        }
    }
     /*
        public String[] list() :返回一個String陣列,表示該File目錄中的所有子檔案或目錄。
        遍歷構造方法中給出的目錄,會獲取目錄中所有檔案/資料夾的名稱,
            把獲取到的多個名稱儲存到一個String型別的陣列中
     */
    @Test
    public void FileTestDemo13(){
        File file=new File("D:\\workplace\\java\\idea\\Test1");
        String [] arr=file.list();
        for(String fileName:arr){
            System.out.println(fileName);
        }
    }
View Code
import java.io.File;

/*
    練習:
        遞迴列印多級目錄
    需求:
        遍歷c:\\abc資料夾,及abc資料夾的子資料夾
        只要.java結尾的檔案
        c:\\abc
        c:\\abc\\abc.txt
        c:\\abc\\abc.java
        c:\\abc\\a
        c:\\abc\\a\\a.jpg
        c:\\abc\\a\\a.java
        c:\\abc\\b
        c:\\abc\\b\\b.java
        c:\\abc\\b\\b.txt
 */
public class FileMain {
    public static void main(String[] args) {
        File file = new File("D:\\workplace\\java\\idea\\Test1");
        getAllFile(file);
    }
    public static void getAllFile(File dir){
        File[] files = dir.listFiles();
        for(File f:files){
            //對遍歷得到的File物件f進行判斷,判斷是否是資料夾
            if(f.isDirectory()){
                //f是一個資料夾,則繼續遍歷這個資料夾
                //我們發現getAllFile方法就是傳遞資料夾,遍歷資料夾的方法
                //所以直接呼叫getAllFile方法即可:遞迴(自己呼叫自己)
                getAllFile(f);
            }else{
                //f是一個檔案,直接列印即可
                /*
                    c:\\abc\\abc.java
                    只要.java結尾的檔案
                    1.把File物件f,轉為字串物件
                 */
                //String name = f.getName();//abc.java
                //String path = f.getPath();//c:\\abc\\abc.java
                //String s = f.toString();//c:\\abc\\abc.java

                //把字串,轉換為小寫
                //s = s.toLowerCase();

                //2.呼叫String類中的方法endsWith判斷字串是否是以.java結尾
                //boolean b = s.endsWith(".java");

                //3.如果是以.java結尾的檔案,則輸出
                /*if(b){
                    System.out.println(f);
                }*/
                String name=f.getName();
                System.out.println(name);
                if(f.getName().toLowerCase().endsWith(".java")){
                    System.out.println(f);
                }
            }
        }
    }
}
View Code