1. 程式人生 > >Java基礎知識IO流(File)

Java基礎知識IO流(File)

File概述

File類用來將檔案或者資料夾封裝成物件。方便對檔案和資料夾的屬性資訊進行操作。
構造方法:
1.File(File parent, String child)
根據 parent 抽象路徑名和 child 路徑名字串建立一個新 File 例項。
2.File(String pathname)
通過將給定路徑名字串轉換為抽象路徑名來建立一個新 File 例項。
3.File(String parent, String child)
根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 例項。
4.File(URI uri)
通過將給定的 file: URI 轉換為一個抽象路徑名來建立一個新的 File 例項。

    File f1=new File("a.txt");
    File f2=new File("F:\\Study\\javatest\\myday20","b.txt");

    File d=new File("F:\\Study\\javatest\\myday20");
    File f3=new File(d,"c.txt");
    File f4=new      File("F:"+File.separator+"Study"+File.separator+"javatest"+File.separator+"myday20"+File.separator+"d.txt"
);

File類的separator屬性: 與系統有關的預設名稱分隔符,為了方便,它被表示為一個字串。
File類常見方法:建立、刪除、判斷、

File物件功能-建立、刪除、判斷

建立:
1.boolean createNewFile():在指定位置建立檔案,如果該檔案已經存在,則不建立,返回false,若不存在則建立,返回true.建立檔案的操作為呼叫系統底層資源,所以會丟擲IOException異常。
和輸出流不一樣,輸出流物件一建立就會建立檔案,而且檔案若已經存在,會覆蓋。
2.mkdir():建立指定的目錄,即建立單極目錄。
3.mkdirs():建立此指定的目錄,包括所有必須但不存在的父目錄。即建立多級資料夾。
刪除:


delete():成功刪除返回真,刪除失敗返回假。
deleteOnExit():在程式退出時自動刪除指定檔案,即告訴虛擬機器退出時刪除此檔案。
判斷:
canExecute():判斷檔案是否可執行。
canRead():判斷檔案是否可以讀取。
canWrite():判斷檔案是否可以修改。
compareTo(File pathname):按字母順序比較兩個檔名
exists():判斷檔案或目錄是否存在。
isDirectory(),isFile():判斷是目錄還是檔案。判斷之前必須先判斷該檔案物件封裝的內容是否存在,即exits()
isHidden():是否是隱藏檔案
isAbsolute():判斷是否是絕對路徑,即使檔案還未建立也可以判斷

獲取
getName():獲取檔名稱。
getParent():返回封裝時檔名之前的路徑。如果封裝時只有檔名,那麼返回空。
getPath():將此抽象路徑名轉換為一個路徑名字串。封裝什麼路徑,返回什麼路徑。
getAbsolutePath():返回此抽象路徑名的絕對路徑名字串。
getAbsoluteFile():返回此抽象路徑名的絕對路徑名形式。
lastModified():返回此抽象路徑名錶示的檔案最後一次被修改的時間。
length():返回由此抽象路徑名錶示的檔案的長度。
reNameTo():當且僅當重新命名成功時,返回 true;否則返回 false 。如果路徑不同,相當於剪下。

listFiles():返回當前機器有效的碟符,C:,D:等
list():返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中的檔案和目錄。呼叫list方法的file物件必須是封裝了一個目錄。該目錄還必須存在。不然返回null。
list(FilenameFilter filter):FilenameFilter是一個介面,實現此介面的類例項用於過濾檔名。list()方法依據filter的accept()方法的返回值true或者false來判斷是否是需要的檔案。 通過建立匿名內部類,並重寫accept()方法來設定過濾條件。

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        method_1();
    }

    public static void method_1()
    {
        File file=new File("F:\\Study\\javatest\\myday19");
        String[] files=file.list(new FilenameFilter()
            {

                public boolean accept(File dir,String name)
                {
                    return name.endsWith(".jpg");
                }

        });

        for(String f:files)
        {
            System.out.println(f);
        }

    }
}

這裡寫圖片描述

如何列出指定目錄下檔案或者資料夾,包含子目錄中的內容,也就是列出指定目錄下所有內容
採用遞迴的方式:函式自己呼叫自己。
遞迴要注意:1、限定遞迴結束條件,2、注意遞迴的次數,儘量避免記憶體溢位。

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        File file=new File("F:\\Study\\javatest");
        method_1(file);
    }

    public static void method_1(File file)
    {       
        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {
                System.out.println("資料夾----"+files[x]);
                method_1(files[x]);
            }   
            else
                System.out.println("檔案"+files[x]);
        }

    }
}

這裡寫圖片描述

在使用遞迴時,注意遞迴的次數,儘量避免記憶體溢位
這裡寫圖片描述
不斷呼叫本身,遞迴次數過多,會造成記憶體溢位。

如何列出指定目錄下檔案或者資料夾,包含子目錄中的內容,也就是列出指定目錄下所有內容,同時要求帶層次

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        File file=new File("F:\\Study\\javatest");
        method_1(file,0);
    }

    public static String getLevel(int level)
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<level;i++)
        {
            sb.append("|--");

        }
        return sb.toString();
    }
    public static void method_1(File file,int level)
    {       
        System.out.println(getLevel(level)+file.getName());
        level++;
        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {           
                method_1(files[x],level);
            }   
            else
                System.out.println(getLevel(level)+files[x]);
        }

    }
}

這裡寫圖片描述

刪除一個帶內容的目錄
Windows系統中刪除目錄的原理是從裡面往外刪除。

public static void deleteFiles(File file)
    {       

        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {           
                deleteFiles(files[x]);
            }   
            else
                System.out.println(files[x]+"file"+files[x].delete());
        }
        System.out.println(file+"Director"+file.delete());

    }

練習:
要求:將一個指定目錄下的java檔案的絕對路徑,儲存到一個文字檔案中。
建立一個java檔案列表檔案。
思路:
1,對指定的目錄進行遞迴。
2,獲取遞迴過程所以的java檔案的路徑。
3,將這些路徑儲存到集合中。
4,將集合中的資料寫入到一個檔案中。

import java.io.*;
import java.util.*;
class  JavaFileList
{
    public static void main(String[] args) throws IOException
    {

        File dir = new File("d:\\java1223");

        List<File> list = new ArrayList<File>();

        fileToList(dir,list);

        //System.out.println(list.size());


        File file = new File(dir,"javalist.txt");
        writeToFile(list,file.toString());




    }
    public static void fileToList(File dir,List<File> list)
    {
        File[] files = dir.listFiles();

        for(File file : files)
        {
            if(file.isDirectory())
                fileToList(file,list);
            else
            {
                if(file.getName().endsWith(".java"))
                    list.add(file);
            }
        }
    }

    public static void writeToFile(List<File> list,String javaListFile)throws IOException
    {
        BufferedWriter bufw =  null;
        try
        {
            bufw = new BufferedWriter(new FileWriter(javaListFile));

            for(File f : list)
            {
                String path = f.getAbsolutePath();
                bufw.write(path);
                bufw.newLine();
                bufw.flush();
            }

        }
        catch (IOException e)
        {
            throw e;
        }
        finally
        {
            try
            {
                if(bufw!=null)
                    bufw.close();
            }
            catch (IOException e)
            {
                throw e;
            }
        }
    }
}