Java_IO

今日內容介紹 java

  • File
  • 遞歸

File 數組

IO概述

回想以前寫過的程序,數據都是在內存中,一旦程序運行結束,這些數據都沒有了,等下次再想使用這些數據,但是已經沒有了。那怎麼辦呢?能不能把運算完的數據都保存下來,下次程序啓動的時候,再把這些數據讀出來繼續使用呢?其實要把數據持久化存儲,就須要把內存中的數據存儲到內存之外的其餘持久化設備(硬盤、光盤、U盤等)上。ide

當須要把內存中的數據存儲到持久化設備上這個動做稱爲輸出(寫)Output操做。函數

當把持久設備上的數據讀取到內存中的這個動做稱爲輸入(讀)Input操做。測試

所以咱們把這種輸入和輸出動做稱爲IO操做。ui

簡單瞭解IO是怎麼一回事以後,接下來就要進一步作系統瞭解。spa

在咱們操做系統中,數據都保存在文件中,而文件存放相應的文件夾中。那麼Java中是如何描述這些的呢?操作系統

File類的出現

打開API,搜索File類。閱讀其描述:File文件和目錄路徑名的抽象表示形式。即,Java中把文件或者目錄(文件夾)都封裝成File對象。也就是說若是咱們要去操做硬盤上的文件,或者文件夾只要找到File這個類便可。那麼咱們就要研究研究File這個類中都有那些功能能夠操做文件或者文件夾呢?3d

File類的構造函數

  • 經過構造方法建立File對象,咱們進行演示:
public class FileDemo {

    public static void main(String[] args) {

        //File構造函數演示

        String pathName = "e:\\java_code\\day22e\\hello.java";

        File f1 = new File(pathName);//將Test22文件封裝成File對象。注意;有能夠封裝不存在文件或者文件夾,變成對象。

        System.out.println(f1);

        

        File f2 = new File("e:\\java_code\\day22e","hello.java");

        System.out.println(f2);

        

        //將parent封裝成file對象。

        File dir = new File("e:\\java_code\\day22e");

        File f3 = new File(dir,"hello.java");

        System.out.println(f3);

    }

}
View Code

File類的獲取

建立完了File對象以後,那麼File類中都有以下經常使用方法,能夠獲取文件相關信息code

 

  • 方法演示以下:
public class FileMethodDemo {

    public static void main(String[] args) {

        //建立文件對象

        File file = new File("Test22.java");

        //獲取文件的絕對路徑,即全路徑

        String absPath = file.getAbsolutePath();

        //File中封裝的路徑是什麼獲取到的就是什麼。

        String path = file.getPath();

        //獲取文件名稱

        String filename = file.getName();

        //獲取文件大小

        long size = file.length();

        

        System.out.println("absPath="+absPath);

        System.out.println("path="+path);

        System.out.println("filename="+filename);

        System.out.println("size="+size);

    }

}
View Code

文件和文件夾的建立刪除等

常常上面介紹,咱們知道能夠經過File獲取到文件名稱,文件路徑(目錄)等信息。

接下來演示使用File類建立、刪除文件等操做。

 

  • 咱們進行方法的演示
public class FileMethodDemo2 {

    public static void main(String[] args) throws IOException {

        // 對文件或者文件加進行操做。

        File file = new File("e:\\file.txt");

        // 建立文件,若是文件不存在,建立 true 若是文件存在,則不建立 false。若是路徑錯誤,IOException。

        boolean b1 = file.createNewFile();

        System.out.println("b1=" + b1);

        //-----------刪除文件操做-------注意:不去回收站。慎用------

         boolean b2 = file.delete();

         System.out.println("b2="+b2);

 

        //-----------須要判斷文件是否存在------------

         boolean b3 = file.exists();

         System.out.println("b3="+b3);

 

        //-----------對目錄操做建立,刪除,判斷------------

        File dir = new File("e:\\abc");

        //mkdir()建立單個目錄。//dir.mkdirs();建立多級目錄

        boolean b4 = dir.mkdir();

        System.out.println("b4="+b4);

        //刪除目錄時,若是目錄中有內容,沒法直接刪除。

        boolean b5 = dir.delete();

        //只有將目錄中的內容都刪除後,保證該目錄爲空。這時這個目錄才能夠刪除。

        System.out.println("b5=" + b5);

 

        //-----------判斷文件,目錄------------

        File f = new File("e:\\javahaha");// 要判斷是不是文件仍是目錄,必須先判斷存在。

        // f.mkdir();//f.createNewFile();

        System.out.println(f.isFile());

        System.out.println(f.isDirectory());

    }

}
View Code

listFiles()方法介紹

文件都存放在目錄(文件夾)中,那麼如何獲取一個目錄中的全部文件或者目錄中的文件夾呢?那麼咱們先想一想,一個目錄中可能有多個文件或者文件夾,那麼若是File中有功能獲取到一個目錄中的全部文件和文件夾,那麼功能獲得的結果要麼是數組,要麼是集合。咱們開始查閱API。

 

  • 方法演示以下:
public class FileMethodDemo3 {

    public static void main(String[] args) {

        File dir = new File("e:\\java_code");

        //獲取的是目錄下的當前的文件以及文件夾的名稱。

        String[] names = dir.list();

        for(String name : names){

            System.out.println(name);

        }

        //獲取目錄下當前文件以及文件對象,只要拿到了文件對象,那麼就能夠獲取其中想要的信息

        File[] files = dir.listFiles();

        for(File file : files){

            System.out.println(file);

        }

    }

}
View Code

注意:在獲取指定目錄下的文件或者文件夾時必須知足下面兩個條件

1,指定的目錄必須是存在的,

2,指定的必須是目錄。不然容易引起返回數組爲null,出現NullPointerException

文件過濾器

經過listFiles()方法,咱們能夠獲取到一個目錄下的全部文件和文件夾,但能不能對其進行過濾呢?好比咱們只想要一個目錄下的指定擴展名的文件,或者包含某些關鍵字的文件夾呢?

咱們是能夠先把一個目錄下的全部文件和文件夾獲取到,並遍歷當前獲取到全部內容,遍歷過程當中在進行篩選,可是這個動做有點麻煩,Java給咱們提供相應的功能來解決這個問題。

查閱File類的API,在查閱時發現File類中重載的listFiles方法,而且接受指定的過濾器。

 

  • 測試類
public class FileDemo2 {

    public static void main(String[] args) {

        //獲取擴展名爲.java全部文件

        //建立File對象

        File file = new File("E:\\code\\day11_code");

        //獲取指定擴展名的文件,因爲要對全部文件進行擴展名篩選,所以調用方法須要傳遞過濾器

        File[] files = file.listFiles(new MyFileFilter());

        //遍歷獲取到的全部符合條件的文件

        for (File f : files) {

            System.out.println(f);

        }

    }

}
View Code
  • 自定類繼承FilenameFilter過濾器接口
//定義類實現文件名稱FilenameFilter過濾器

class MyFileFilter implements FilenameFilter{

    public boolean accept(File dir, String name) {

        return name.endsWith(".java");

    }

}
View Code

在查閱API時,咱們發現,在listFiles(FileFilter filter) 也能夠接受一個FileFilter過濾器,它和咱們講的FilenameFilter有啥區別呢?

FilenameFilter過濾器中的accept方法接受兩個參數,一個當前文件或文件夾所在的路徑,一個是當前文件或文件夾對象的名稱。

FileFilter 過濾器中的accept方法接受一個參數,這個參數就當前文件或文件夾對象

當咱們須要過濾文件名稱時就可使用FilenameFilter這個過濾器,當咱們想對當前文件或文件夾進行過濾,就可使用FileFilter ,好比須要當前目錄下的全部文件夾,就可使用FileFilter 過濾器。

  • 測試類
public class FileDemo2 {

    public static void main(String[] args) {

        //獲取擴展名爲.java全部文件

        //建立File對象

        File file = new File("E:\\code\\day11_code");

        //獲取指定目錄下的文件夾

        File[] files = file.listFiles(new FileFileterByDir());

        //遍歷獲取到的全部符合條件的文件

        for (File f : files) {

            System.out.println(f);

        }

    }

}
View Code
  • 自定義類繼承FileFilter過濾器接口
//文件過濾器

class FileFileterByDir implements FileFilter{

    public boolean accept(File pathname) {

        return pathname.isDirectory();

    }

}
View Code

遞歸

遞歸的概述

遞歸,指在當前方法內調用本身的這種現象

public void method(){

    System.out.println("遞歸的演示");

    //在當前方法內調用本身

    method();

}

遞歸分爲兩種,直接遞歸和間接遞歸。

直接遞歸稱爲方法自身調用本身。間接遞歸能夠A方法調用B方法,B方法調用C方法,C方法調用A方法。

  • 遞歸的代碼演示,計算1-n之間的和,使用遞歸完成
public class DiGuiDemo {

    public static void main(String[] args) {

        //計算1~num的和,使用遞歸完成

        int n = 5;

        int sum = getSum(n);

        System.out.println(sum);

        

    }

    public static int getSum(int n) {

        if(n == 1){

            return 1;

        }

        return n + getSum(n-1);

    }

}
View Code
  • 代碼執行流程圖解

注意:遞歸必定要有條件限定,保證遞歸可以中止下來,不然會發生棧內存溢出。

在遞歸中雖然有限定條件,可是遞歸次數不能太多。不然也會發生棧內存溢出。

遞歸打印全部子目錄中的文件路徑

編寫一個方法用來打印指定目錄中的文件路徑,並進行方法的調用

要求:若指定的目錄有子目錄,那麼把子目錄中的文件路徑也打印出來

步驟:

    1. 指定要打印的目錄File對象

    2. 調用getFileAll()方法

        2.1 獲取指定目錄中的全部File對象

        2.2 遍歷獲得每個File對象

        2.3 判斷當前File 對象是不是目錄

            判斷結果爲true,說明爲目錄,經過遞歸,再次調用步驟2的getFileAll()方法

            判斷結果爲false,說明是文件,打印文件的路徑

  • 代碼演示
public class FileDemo2 {

    public static void main(String[] args) {

        File file = new File("d:\\test");

        getFileAll(file);

    }

    //獲取指定目錄以及子目錄中的全部的文件

    public static void getFileAll(File file) {

        File[] files = file.listFiles();

        //遍歷當前目錄下的全部文件和文件夾

        for (File f : files) {

            //判斷當前遍歷到的是否爲目錄

            if(f.isDirectory()){

                //是目錄,繼續獲取這個目錄下的全部文件和文件夾

                getFileAll(f);

            }else{

                //不是目錄,說明當前f就是文件,那麼就打印出來

                System.out.println(f);

            }

        }

    }

}
View Code

搜索指定目錄中的.java文件(含子目錄)

需求:打印指定目錄即全部子目錄中的.java文件的文件路徑

要求:編寫一個方法用來打印指定目錄中的.java文件路徑,並進行方法的調用

若指定的目錄有子目錄,那麼把子目錄中的.java文件路徑也打印出來

步驟:

    1. 指定要打印的目錄File對象

    2. 調用getFileAll()方法,傳入要打印的目錄File對象

        2.1 經過FilenameFilter過濾器獲取指定目錄中的全部.java類型的File對象

        2.2 遍歷獲得每個File對象

        2.3 判斷當前File 對象是不是目錄

            判斷結果爲true,說明爲目錄,經過遞歸,再次調用步驟2的getFileAll()方法

            判斷結果爲false,說明是文件,打印文件的路徑

實現代碼步驟

  • 測試類
public class FileDemo4 {

    public static void main(String[] args) {

        File file = new File("d:\\test");

        getFileAll(file);

    }

    //獲取指定目錄以及子目錄中的全部的文件

    public static void getFileAll(File file) {

        File[] files = file.listFiles(MyFileFilter());

        //遍歷當前目錄下的全部文件和文件夾

        for (File f : files) {

            //判斷當前遍歷到的是否爲目錄

            if(f.isDirectory()){

                //是目錄,繼續獲取這個目錄下的全部文件和文件夾

                getFileAll(f);

            }else{

                //不是目錄,說明當前f就是文件,那麼就打印出來

                System.out.println(f);

            }

        }

    }

}
View Code
  • 自定類繼承FilenameFilter過濾器接口
//定義類實現文件名稱FilenameFilter過濾器

class MyFileFilter implements FilenameFilter{

    public boolean accept(File dir, String name) {

        return name.endsWith(".java");

    }

}

 
View Code

總結

知識點總結

  • 遞歸: 方法定義中調用方法自己的現象
    • 直接遞歸
  •    public void methodA(){
    
                methodA();
    
            }
  • 間接遞歸
       public void metohdB(){
            methodC();
        }
        public void methodC(){
            methodB();
        }
  • 遞歸注意實現
    • 要有出口,不然就是死遞歸
    • 次數不能太多,不然就內存溢出
  • File: 文件和目錄路徑名的抽象表示形式
    • 構造方法:

    public File(String pathname) 經過給定的文件或文件夾的路徑,來建立對應的File對象

    public File(String parent, String child) 經過給定的父文件夾路徑,與給定的文件名稱或目錄名稱來建立對應的File對象

    public File(File parent, String child)經過給定的File對象的目錄路徑,與給定的文件夾名稱或文件名稱來建立對應的File對象

  • 路徑的分類:
    • 絕對路徑, 帶盤盤符

        E:\Workspace\File\abc.txt

  • 相對路徑, 不帶盤符

      File\abc.txt

  • 注意: 當指定一個文件路徑的時候,若是採用的是相對路徑,默認的目錄爲 項目的根目錄
  • 方法

public boolean createNewFile()建立文件

  • 返回值爲true, 說明建立文件成功
  • 返回值爲false,說明文件已存在,建立文件失敗

public boolean mkdir() 建立單層文件夾

  • 建立文件夾成功,返回 true
  • 建立文件夾失敗,返回 false

public boolean mkdirs() 建立多層文件夾

public boolean delete()

  • 刪除此抽象路徑名錶示的文件或目錄。
  • 若是此路徑名錶示一個目錄,則該目錄必須爲空才能刪除

public boolean isDirectory() 判斷是否爲文件夾

public boolean isFile() 判斷是否爲文件

    public boolean exists() 判斷File對象對應的文件或文件夾是否存在

public String getAbsolutePath() 獲取當前File的絕對路徑

public String getName() 獲取當前File對象的文件或文件夾名稱

public long length() 獲取當前File對象的文件或文件夾的大小(字節)

    public File[] listFiles() 獲取File所表明目錄中全部文件或文件夾的絕對路徑

相關文章
相關標籤/搜索