1. 程式人生 > >13、IO (File、遞歸)

13、IO (File、遞歸)

文件的 oid code 適合 重寫 根據 參與 判斷 boolean

File

File類的概述和作用

* A:File類的概述和作用
    * a: File的概念
        * File類是文件和目錄路徑名的抽象表示形式
        * Java中把文件或者目錄(文件夾)都封裝成File對象
        * 我們要去操作硬盤上的文件,或者文件夾只要找到File這個類即可

File類靜態的成員變量

* A:File類靜態的成員變量
    * a: pathSeparator
        * 與系統有關的路徑分隔符,為了方便,它被表示為一個字符串
    * b: separator
        * 與系統有關的默認名稱分隔符,為了方便,它被表示為一個字符串
        
    * c: 案例代碼
        /*
         *  java.io.File
         *    將操作系統中的,文件,目錄(文件夾),路徑,封裝成File對象
         *    提供方法,操作系統中的內容
         *    File與系統無關的類
         *    文件 file
         *    目錄 directory
         *    路徑 path
         */
        public class FileDemo {
            public static void main(String[] args) {
                //File類靜態成員變量
                //與系統有關的路徑分隔符
                String separator = File.pathSeparator;
                System.out.println(separator);// 是一個分號,目錄的分割(window中環境變量配置各個路徑用分號分割,表示一個完整的路徑結束)  Linux中是冒號 :
                
                //與系統有關的默認名稱分隔符
                separator = File.separator;
                System.out.println(separator);// 向右 \  目錄名稱分割  Linux / 
            }
        }

?

File類構造方法_1

* A: File類構造方法_1
    * a: File(String pathname)
        * 通過將給定路徑名字符串轉換為一個File對象,之後可以使用File中的方法
        * windows中的路徑或文件名不區分大小寫
    * d: 案例代碼
        public class FileDemo1 {
            public static void main(String[] args) {
                function();
            }
            /*
             *  File(String pathname)
             *  傳遞路徑名: 可以寫到文件夾,可以寫到一個文件
             *  c:\\abc   c:\\abc\\Demo.java
             *  將路徑封裝File類型對象
             */
            public static void function(){
                File file = new File("d:\\eclipse");
                System.out.println(file);
            }
        }

相對路徑和絕對路徑

* A: 相對路徑和絕對路徑
    * a: 絕對路徑
        * 絕對路徑是一個固定的路徑,從盤符開始
    * b: 相對路徑
        * 相對路徑相對於某個位置,在eclipse下是指當前項目下  
    * c: 路徑
            絕對路徑
                在系統中具有唯一性
                c:\\windows\\system32
            相對路徑
                表示路徑之間的關系
                D:\\develop\\Java\\jdk1.7.0_72\\bin
                D:\\develop\\Java\\jre7
                路徑之間關系
                    Java 父目錄是D:\\develop
                    Java 子目錄是:jdk1.7.0_72
                父路徑是 唯一性
                子目錄是可以多個

?

File類的構造方法_2

* A: File類的構造方法_2
    * a:File(String parent, String child) 
        * 根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 對象
                        
    * b: File(File parent, String child)
    
    * c: 案例代碼
    public class FileDemo1 {
        public static void main(String[] args) {
            function_2();
        }
        /*
         *  File(File parent,String child)
         *  傳遞路徑,傳遞File類型父路徑,字符串子路徑
         *  好處: 父路徑是File類型,父路徑可以直接調用File類方法
         */
        public static void function_2(){
            File parent = new File("d:");
            File file = new File(parent,"eclipse");
            System.out.println(file);
        }
        
        /*
         *  File(String parent,String child)
         *  傳遞路徑,傳遞字符串父路徑,字符串子路徑
         *  好處: 單獨操作父路徑和子路徑
         */
        public static void function_1(){
            File file = new File("d:","eclipse");
            System.out.println(file);
        }
    }

?

File類創建文件功能

* A: File類創建文件功能
    * a: public boolean createNewFile()
        * 創建文件 如果存在這樣的文件,就不創建了
            
    * b: 案例代碼
        public class FileDemo2 {
            public static void main(String[] args)throws IOException {
                function();
            }                       
            /*
             *  File創建文件的功能
             *  boolean createNewFile()
             *  創建的文件路徑和文件名,在File構造方法中給出
             *  文件已經存在了,不在創建
             */
            public static void function()throws IOException{
                File file = new File("c:\\a.txt");
                boolean b = file.createNewFile();
                System.out.println(b);
            }
        }

?

File類創建目錄功能

* A: File類創建目錄功能
    * a: 創建目錄
        * public boolean mkdir():創建文件夾 如果存在這樣的文件夾,就不創建了
        * public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
    * b: 案例代碼
        public class FileDemo2 {
            public static void main(String[] args)throws IOException {
                function_1();
            }
            /*
             *  File創建文件夾功能
             *  boolean mkdirs() 創建多層文件夾
             *  創建的路徑也在File構造方法中給出
             *  文件夾已經存在了,不在創建
             */
            public static void function_1(){
                File file = new File("c:\\abc");
                boolean b = file.mkdirs();
                System.out.println(b);
            }               
        }

File類刪除功能

* A: File類刪除功能
    * a: 刪除功能
        * public boolean delete():刪除文件或者文件夾
* B: 案例代碼
    public class FileDemo2 {
        public static void main(String[] args)throws IOException {
            function_2();
        }
        /*
         *  File類的刪除功能
         *  boolean delete()
         *  刪除的文件或者是文件夾,在File構造方法中給出
         *  刪除成功返回true,刪除失敗返回false
         *  刪除方法,不走回收站,直接從硬盤中刪除
         *  刪除有風險,運行需謹慎
         */
        public static void function_2(){
            File file = new File("c:\\a.txt");
            boolean b = file.delete();
            System.out.println(b);
        }           
    }

File類獲取功能

* A:File類獲取功能
    * a: 方法介紹
        * String getName(): 返回路徑中表示的文件或者文件夾名
            * 獲取路徑中的最後部分的名字
        * long length(): 返回路徑中表示的文件的字節數
        * String getAbsolutePath(): 獲取絕對路徑,返回String對象
        * File   getAbsoluteFile() : 獲取絕對路徑,返回File對象
            * eclipse環境中,寫一個相對路徑,絕對位置工程根目錄
        * String getParent(): 獲取父路徑,返回String對象
        * File getParentFile(): 獲取父路徑,返回File對象
                
    * b: 案例代碼
    
        public class FileDemo3 {
            public static void main(String[] args) {
                function_3();
            }
            /*
             * File類的獲取功能
             * String getParent() 返回String對象
             * File getParentFile()返回File對象
             * 獲取父路徑
             */
            public static void function_3(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                File parent = file.getParentFile();
                System.out.println(parent);
            }
            
            /*
             * File類獲取功能
             * String getAbsolutePath() 返回String對象
             * File   getAbsoluteFile() 返回File對象
             * 獲取絕對路徑
             * eclipse環境中,寫的是一個相對路徑,絕對位置工程根目錄
             */
            public static void function_2(){
                File file = new File("src");
                File absolute = file.getAbsoluteFile();
                System.out.println(absolute);
            }
            
            /*
             * File類獲取功能
             * long length()
             * 返回路徑中表示的文件的字節數
             */
            public static void function_1(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                long length = file.length();
                System.out.println(length);
            }
            
            /*
             *  File類的獲取功能
             *  String getName()
             *  返回路徑中表示的文件或者文件夾名
             *  獲取路徑中的最後部分的名字
             */
            public static void function(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                String name = file.getName();
                System.out.println(name);
                
                /*String path = file.getPath();
                System.out.println(path);*/
        //      System.out.println(file);
            }
        }

?

File類判斷功能

* A: File類判斷功能
    * a: 方法介紹
        * boolean exists(): 判斷File構造方法中封裝路徑是否存在
            * 存在返回true,不存在返回false
        * boolean isDirectory(): 判斷File構造方法中封裝的路徑是不是文件夾
            * 如果是文件夾,返回true,不是文件返回false
        * boolean isFile(): 判斷File構造方法中封裝的路徑是不是文件
            * 如果是文件,返回true,不是文件返回false

    * b: 案例代碼
        public class FileDemo4 {
            public static void main(String[] args) {
                function_1();
            }
            /*
             *  File判斷功能
             *  boolean isDirectory()
             *  判斷File構造方法中封裝的路徑是不是文件夾
             *  如果是文件夾,返回true,不是文件返回false
             *  
             *  boolean isFile()
             *  判斷File構造方法中封裝的路徑是不是文件
             */
            public static void function_1(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                if(file.exists()){
                    boolean b = file.isDirectory();
                    System.out.println(b);
                }
            }
            
            /*
             *  File判斷功能
             *  boolean exists()
             *  判斷File構造方法中封裝路徑是否存在
             *  存在返回true,不存在返回false
             */
            public static void function(){
                File file = new File("src");
                boolean b = file.exists();
                System.out.println(b);
            }
        }

File類list獲取功能

* A: File類list獲取功能
    * a: 方法介紹
        * String[] list():獲取到File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
            * 返回只有名字
        * File[] listFiles():獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
            * 返回的是目錄或者文件的全路徑
        * static File[] listRoots(): 列出可用的文件系統根 
    
    * b: 案例代碼
        public class FileDemo {
            public static void main(String[] args) {
                function_2();
            }
            public static void function_2(){
                //獲取系統中的所有根目錄
                File[] fileArr = File.listRoots();
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
            
            /*
             *  File類的獲取功能
             *  File[] listFiles()
             *  獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
             *  返回的是目錄或者文件的全路徑
             */
            public static void function_1(){
                File file = new File("d:\\eclipse");
                File[] fileArr = file.listFiles();
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
            
            /*
             *  File類的獲取功能
             *  String[] list()
             *  獲取到,File構造方法中封裝的路徑中的文件和文件夾名 (遍歷一個目錄)
             *  返回只有名字
             */
            public static void function(){
                File file = new File("c:");
                String[] strArr = file.list();
                System.out.println(strArr.length);
                for(String str : strArr){
                    System.out.println(str);
                }
            }
        }

文件過濾器

* A: 文件過濾器
    * a: 作用
        * 過濾一個目錄下的指定擴展名的文件,或者包含某些關鍵字的文件夾
        
    * b: 方法介紹
        * public String[] list(FilenameFilter filter)
        * public File[] listFiles(FileFilter filter)
        
    * C: 案例代碼   
        /*
         *  自定義過濾器
         *  實現FileFilter接口,重寫抽象方法
         */
        public class MyFilter implements FileFilter{
            public boolean accept(File pathname)  {
                /*
                 * pathname 接受到的也是文件的全路徑
                 * c:\\demo\\1.txt
                 * 對路徑進行判斷,如果是java文件,返回true,不是java文件,返回false
                 * 文件的後綴結尾是.java
                 */
                //String name = pathname.getName();
                return pathname.getName().endsWith(".java");
                
            }
        }
        
        /*
         *  File類的獲取,文件獲取過濾器
         *  遍歷目錄的時候,可以根據需要,只獲取滿足條件的文件
         *  遍歷目錄方法 listFiles()重載形式
         *  listFiles(FileFilter filter)接口類型
         *  傳遞FileFilter接口的實現類
         *  自定義FileFilter接口實現類,重寫抽象方法,
         *  接口實現類對象傳遞到遍歷方法listFiles
         */
        public class FileDemo1 {
            public static void main(String[] args) {
                File file = new File("c:\\demo");
                File[] fileArr = file.listFiles(new MyFilter());
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
        }

文件過濾器_原理分析

* A:文件過濾器_原理分析
    * listFiles()遍歷目錄的同時,獲取到了文件名全路徑,調用過濾器的方法accept,將獲取到的路徑傳遞給accept方法的參數pathname
    * accept方法接收了參數pathname,參數是listFiles傳遞來的
    * 在accept方法中,進行判斷,如果這個路徑是Java文件,返回true,走著返回false
    * 一旦方法返回了true
    * listFiles將路徑保存到File數組中

遞歸

遞歸遍歷全目錄

* A: 遞歸遍歷全目錄
    * a: 案例代碼
        /*
         *  對一個目錄的下的所有內容,進行完全的遍歷
         *  編程技巧,方法的遞歸調用,自己調用自己
         */
        public class FileDemo {
            public static void main(String[] args) {
                File dir = new File("d:\\eclipse");
                getAllDir(dir);
            }
            /*
             *  定義方法,實現目錄的全遍歷
             */
            public static void getAllDir(File dir){
                System.out.println(dir);
                //調用方法listFiles()對目錄,dir進行遍歷
                File[] fileArr = dir.listFiles();
                for(File f : fileArr){
                    //判斷變量f表示的路徑是不是文件夾
                    if(f.isDirectory()){
                        //是一個目錄,就要去遍歷這個目錄
                        //本方法,getAllDir,就是給個目錄去遍歷
                        //繼續調用getAllDir,傳遞他目錄
                        getAllDir(f);
                    }else{
                        System.out.println(f);
                    }
                }
            }
        }

?

遞歸概念和註意事項

* A:遞歸概念和註意事項
    * a: 遞歸概念
        * 遞歸,指在當前方法內調用自己的這種現象
        * 遞歸分為兩種,直接遞歸和間接遞歸
        * 直接遞歸稱為方法自身調用自己。間接遞歸可以A方法調用B方法,B方法調用C方法,C方法調用A方法
    * b: 註意事項
        * 遞歸一定要有出口, 必須可以讓程序停下
        * 遞歸次數不能過多
        * 構造方法,禁止遞歸

遞歸求和計算

* A: 遞歸求和計算
    * a: 題目分析
    * 1+2+3+...+(n-1)+n:求1到n的和
    * 總結規律:1到n的和等於1到(n-1)的和再加n
    * getSum(n-1)+ n
    * 遞歸出口:getSum(1) return 1;
    * b: 案例代碼
    /*
     *  方法的遞歸調用
     *    方法自己調用自己
     *  適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
     *  註意:
     *     遞歸一定要有出口, 必須可以讓程序停下
     *     遞歸次數不能過多
     *     構造方法,禁止遞歸
     */
    public class DiGuiDemo {
        public static void main(String[] args) {
            int sum = getSum(3);
            System.out.println(sum);
        }
        /*
             *  計算 1+2+3+100和 = 5050
             *  計算規律:
             *    n+(n-1)+(n-2)
             *    100+(100-1)+(99-1)+...1
             */
        public static int getSum(int n){
            if( n == 1)
                return 1;
            return n + getSum(n-1);
        }
    }

?

遞歸求階乘

* A: 遞歸求和計算
    * a: 題目分析
        * 5!=5*4*3*2*1
        *   =5*4!
        * 4!=4*3!
        * 3!=3*2!
        * 2!=2*1!
        * 1!=1
        * n!=n*(n-1)!
        * 遞歸出口:n*getJieCheng(n-1):  getJieCheng(1) return 1;
    * b: 案例代碼
        /*
         *  方法的遞歸調用
         *    方法自己調用自己
         *  適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
         *  註意:
         *     遞歸一定要有出口, 必須可以讓程序停下
         *     遞歸次數不能過多
         *     構造方法,禁止遞歸
         */
        public class DiGuiDemo {
            public static void main(String[] args) {                    
                System.out.println(getJieCheng(5));
                
            }
                            
            /* 
             *  計算階乘 5!
             *   5*4*3*2*1
             */
            public static int getJieCheng(int n){
                if ( n == 1)
                    return 1;
                return n * getJieCheng(n-1);
            }                               
        }

遞歸計算斐波那契數列

* A: 遞歸計算斐波那契數列
    * a:題目分析
        * 1 1 2 3 5 8 13 21
        * 從第三項開始,後面的每一項都等於前面兩項的和,第一項和第二項的值為1,作為程序的出口
    * b: 案例代碼
        /*
         *  方法的遞歸調用
         *    方法自己調用自己
         *  適合於,方法中運算的主體不變,但是運行的時候,參與運行的方法參數會變化
         *  註意:
         *     遞歸一定要有出口, 必須可以讓程序停下
         *     遞歸次數不能過多
         *     構造方法,禁止遞歸
         */
        public class DiGuiDemo {
            public static void main(String[] args) {                    
                System.out.println(getFBNQ(12));
            }
            /*
             *  方法遞歸,計算斐波那契數列
             *  
             */
            public static int getFBNQ(int month){
                if( month == 1)
                    return 1;
                if( month == 2)
                    return 1;
                return getFBNQ(month-1)+getFBNQ(month-2);
            }
        }

遍歷目錄下的所有java文件

* A: 遍歷目錄下的所有java文件
    * a: 案例代碼
        public class MyJavaFilter implements FileFilter {
            public boolean accept(File pathname) {
                //判斷獲取的是目錄,直接返回true
                if(pathname.isDirectory())
                    return true;
                return pathname.getName().toLowerCase().endsWith(".java");
            }

        }
        /*
         *  遍歷目錄,獲取目錄下的所有.java文件
         *  遍歷多級目錄,方法遞歸實現
         *  遍歷的過程中,使用過濾器
         */
        public class FileDemo1 {
            public static void main(String[] args) {
                getAllJava(new File("c:\\demo"));
        //      new File("c:\\demo").delete();
            }
            /*
             * 定義方法,實現遍歷指定目錄
             * 獲取目錄中所有的.java文件
             */
            public static void getAllJava(File dir){
                //調用File對象方法listFiles()獲取,加入過濾器
                File[] fileArr = dir.listFiles(new MyJavaFilter());
                for(File f : fileArr){
                    //對f路徑,判斷是不是文件夾
                    if(f.isDirectory()){
                        //遞歸進入文件夾遍歷
                        getAllJava(f);
                    }else{
                        System.out.println(f);
                    }
                }
            }
        }

總結

遞歸: 方法定義中調用方法本身的現象

? 直接遞歸

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\day20_File\abc.txt

? 相對路徑, 不帶盤符

? day20_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所代表目錄中所有文件或文件夾的絕對路徑

13、IO (File、遞歸)