1. 程式人生 > >黑馬程式設計師-File類檔案操作,知識梳理與簡單應用

黑馬程式設計師-File類檔案操作,知識梳理與簡單應用

-------------------------------------Android培訓                      java培訓  期待與您的交流!------------------------------------------
/*
    檔案類的初始化,此時並不是真實存在於實體地址-----抽象的

1.建立
    boolean creatrNewFile():在指定位置建立檔案,如果該檔案已經存在,則不建立,返回false。
                            和輸出流不一樣,輸出流物件已建立建立檔案。如果檔案已經存在,會覆蓋。
    
    boolean mkdir():建立資料夾,最多建立一個子目錄
    boolean mkdir():可以建立多級一個資料夾
2.刪除
    boolean delete():刪除失敗返回false;如果因異常而結束的程式可能會報錯
    void deleteOnExit();在程式退出時刪除指定檔案。(包括異常退出程式)

3.判斷
    boolean exists():檔案是否存在,首要判斷
    boolean isFile():是否檔案                
    boolean isDirectory():是否是目錄。
    boolean isHidden();是否是隱藏檔案
    boolean isAbsolute():是否是絕對路徑

4.獲取資訊
    getName();
    getPath();    封裝什麼就獲取什麼路徑
    getParent();該方法返回的是絕對路徑中的檔案父目錄。如果獲取的是相對
                路徑的話,返回null;
                如果相對路徑中有上一層目錄,該目錄就是其返回結果。

    getAbsolutePath() 獲取絕對路徑
    long lastNodified()    返回最後一次修改檔案的時間
    long length()    返回long的檔案大小

*/

import java.io.*;
class FileDemo20_1 
{
    public static void main(String[] args) throws IOException
    {
        
        method_1();
    }
    public static void Method_1() throws IOException
    {
        File file =new File("dwa.txt");
        sop("建立"+file.createNewFile());
        sop("刪除"+file.delete());
    }
    //File封裝的物理上事實上並不存在的
    public static void consMethod()
    {
        File f1=new File("dwa.txt");            //將檔案作為引數封裝成物件

        File f2=new File("f:\\se","dwa.txt");    //當目錄和檔案分別對應兩個引數封裝成引數
        
        File dir=new File("f:\\se");            //將目錄封裝為File物件

        File f3=new File(dir,"dwa.txt");        //將File物件作為引數


        sop("f1="+f1);
        sop("f2="+f2);
        sop("f3="+f3);
    }
    public static void sop(Object o)
    {
        System.out.println(o);
    }
}

/*
    list() //呼叫list方法的file物件必須是封裝了一個目錄。該目錄還必須存在。
            返回當前目錄的所有資料夾,所有檔案(包括隱藏檔案)

    listRoots() //返回系統所有的磁碟。

    需求:
        根據list()的過載方法返回當前目錄下的所有後綴為.java的檔案
        
*/
import java.io.*;
class FileDemo20_5 
{
    public static void main(String[] args) 
    {
        listDemo();
    }
    //返回你所需要的檔案型別
    public static void listDemo()
    {
        File dir=new File("f:\\");

        String [] names=dir.list(new FilenameFilter()
        {
            public boolean accept(File dir,String name)    //內部介面類
            {
                return name.endsWith(".java");            //在指定搜尋字尾名為java的檔案
            }
        });
        System.out.println(names.length);
        for (String name:names)
        {
            System.out.println("name="+name);
        }
    }
}

/*
    利用遞迴遍歷
        列出指定目錄下檔案或者資料夾,包含子目錄中的內容,最後全部都是檔案為止
        
        並將其改進成類似檔案系統的搜尋功能的類
    
    遞迴的注意事項:
        1.限定遞迴的結束條件

        2.要主要遞迴的次數,儘量避免記憶體溢位

    思路:
        1.利用轉換流從鍵盤輸出要搜尋的檔名,
        2.利用遞迴判斷
            2.1如果還是資料夾,就繼續遞迴。
            2.2如果是檔案,就返回上一級目錄,與該檔案同一目錄下的過濾。
            2.3如果啟動了判斷程式,則結果當前的一次迴圈,因為當前目錄已經被遍歷了,避免其他檔案返回上一級又遍歷一次
*/

import java.io.*;
class FileDemo20_7 
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String fileName=br.readLine();                //輸入你要查詢的檔名字
        
        File dir=new File("F:\\");                    //搜尋的盤
        dirList(dir,fileName);

    }
    public static void dirList(File dir,String s)
    {
        File [] llist=dir.listFiles();                //將dir目錄下的所有檔案放入陣列llist中
        for (File i: llist)                            //
        {
                if (i.isDirectory())                //判斷是否是目錄
                {
                    dirList(i,s);                    //如果是則迴歸
                }else
                {
                    File [] suosou=i.getParentFile().listFiles(new FilenameFilter()    
                                                        {
                                                            public boolean accept(File dir,String name)    
                                                        {
                                                                return name.endsWith(s);    
                                                        }
                                                        });//內部介面類過濾方法
                    for (File j:suosou)
                        System.out.println(j);
                    break;                                   //因為當前目錄已經被遍歷了,避免其他檔案返回上一級又遍歷一次
                }
        }
    }
}

/*
    刪除一個帶內容的目錄。

    刪除原理:
        在window中,刪除目錄從裡面往外刪除的。
        既然是從裡往外刪除,就需要用到遞迴。

    java刪除是不走回收站的!,刪除需要謹慎
*/
import java.io.*;
class  RemoveDir
{
    public static void main(String[] args) 
    {
        File dir=new File("f:\\Testdir");
        removeDir(dir);    
    }
    public static void removeDir(File dir)
    {
        File[] files=dir.listFiles();
        for (File file:files )
        {
            if (!file.isHidden()&&file.isDirectory())                //不能刪除具有隱藏檔案的資料夾
            {
                removeDir(file);
            }else
            {
                System.out.println(file.toString()+"--"+file.delete());
            }
        }
        System.out.println(dir.toString()+"||"+dir.delete());        //當資料夾裡面的所有檔案都刪除後,則可以刪除這個資料夾

    }
}

/*
    練習
    將一個指定目錄下相同檔案的絕對路徑,儲存到一個文字檔案中。
    建立一個java檔案列表檔案。

    思路:
        1.對指定的目錄進行遞迴。
        2.獲取遞迴過程所有後綴.java檔案的物件。
        3.將這些檔案物件儲存到集合中。
        4.將集合中資料的絕對路徑寫到一個檔案中
*/
import java.io.*;
import java.util.*;
class JavaFileList 
{
    public static void main(String[] args) 
    {
        File dir=new File("F:\\SE");
        List<File> list=new ArrayList();                    //建立ArrayList集合物件
        javaList(dir,list);
        File file=new File(dir,"java.txt");
        writeToTxt(list,file.toString());
    }

    public static void javaList(File dir,List<File> list)
    {
        File[] files=dir.listFiles();
        for (File file:files)    
        {                                                    //仍然有遍歷目錄的影子
            if(file.isDirectory()){
                javaList(file,list);
            }else{
                if(file.getName().endsWith(".java"))        //如果是java檔案就新增到集合去
                    list.add(file);
            }
        }
    }
    public static void writeToTxt(List<File> list,String Filename)
    {
        BufferedWriter bfw=null;                            //通過字元流對集合進行操作並將結果寫入文字中
        try
        {
            bfw=new BufferedWriter(new FileWriter(Filename));
            for (File file:list )
            {
                bfw.write(file.getAbsolutePath());            //獲取絕對路徑
                bfw.newLine();
                bfw.flush();
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("失敗");                //出錯則結束當前程式
        }finally{
            try
            {
                if(bfw!=null)
                    bfw.close();                            //寫入成功後,要關閉流物件
            }
            catch (IOException e)
            {
                System.out.println(e);
            }
        }
    }
}