1. 程式人生 > >【Java基礎知識】IO流--File類和路徑分隔符

【Java基礎知識】IO流--File類和路徑分隔符

IO流–FIle類和路徑分隔符

1 File類

1.1 File類概述

我們想要操作IO,就必須知道硬碟上檔案的表現形式。File類:IO類包中唯一代表檔案本身的物件,檔案和目錄(資料夾)路徑名的抽象表示形式。File類提供各種方法,我們可以建立、刪除、重新命名檔案,判斷檔案的讀寫許可權,是否存在,設定和查詢檔案的最近修改時間。File類不能訪問檔案的內容,不能夠從檔案中讀取資料或往檔案裡寫資料,它只能對檔案本身的屬性進行操作。

1.2 File類的構造方法

File(String pathname):根據一個路徑得到File物件。
File(String parent, String child):根據一個目錄和一個子檔案/目錄得到File物件
File(File parent, String child):根據一個父File物件和一個子檔案/目錄得到File物件。

1.3 建立File物件

【要注意區分你所建立的是資料夾,還是檔案】

public boolean createNewFile():建立檔案,建立成功返回true, 如果存在這樣的檔案,就不建立了,返回falsepublic boolean mkdir():建立資料夾【父目錄必須存在】,如果存在這樣的資料夾,就不建立了。
public boolean mkdirs():建立資料夾,如果父資料夾不存在,會幫你創建出來。

1.4 刪除File物件

public boolean delete():刪除此抽象路徑名錶示的檔案或目錄。
如果要刪除一個資料夾,則所給資料夾必須為空才可刪除【即該資料夾內不能包括檔案或資料夾】。
在Eclipse中建立檔案或資料夾時,如果忘記寫碟符,在預設是在專案路徑下建立。
Java中File物件的刪除不走回收站,直接刪除。

1.5 重新命名

public boolean renameTo(File dest)
如果路徑名相同,就是改名;如果路徑名不同,就是改名並剪下。
絕對路徑:路徑以碟符開始。
相對路徑:路徑不以碟符開始。

1.6 判斷類方法

public boolean isDirectory():判斷是否是目錄
public boolean isFile():判斷是否是檔案
public boolean exists():判斷是否存在
public boolean canRead():判斷是否可讀
public boolean canWrite():判斷是否可寫
public boolean
isHidden():判斷是否隱藏

1.7 獲取檔案資訊

public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取相對路徑
public String getName():獲取名稱
public long length():獲取長度。位元組數
public long lastModified():獲取最後一次的修改時間,毫秒值

1.8 案例一:輸出D盤目錄下,字尾名以.txt結尾的檔名稱

方法一:直接使用File類的基本方法解決
分析:
A:封裝e判斷目錄
B:獲取該目錄下所有檔案或者資料夾的File陣列
C:遍歷該File陣列,得到每一個File物件,然後判斷
D:是否是檔案
是:繼續判斷是否以.txt結尾
是:就輸出該檔名稱
否:不處理
否:不處理

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("D:\\");
        File[] fileArray = file.listFiles();
        for(File f : fileArray){
            if(f.isFile() && f.getName().endsWith(".txt")){
                System.out.println(f.getName());
            }           
        }   
    }
}
/*執行結果:
 * 摸金天師.txt
 * 盜墓筆記.txt
 * 鬼吹燈.txt
 * */

方法二:使用檔案過濾器作為引數,呼叫list(filter)或者listFiles(filter)方法。
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
呼叫List()方法,並且傳入FilenameFilter 物件作為引數。
FilenameFilter介面的原始碼如下:

public
interface FilenameFilter {
    //測試指定檔案是否應該包含在某一檔案列表中。
    //引數:File被找到的檔案所在的目錄,name檔案的名稱。
    boolean accept(File dir, String name);
}

public String[] list(FilenameFilter filter)原始碼如下:

    public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    ArrayList v = new ArrayList();
    for (int i = 0 ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
        v.add(names[i]);
        }
    }
    return (String[])(v.toArray(new String[v.size()]));
    }

程式碼案例:

public class FilenameFilterDemo {
    public static void main(String[] args) {
        File file = new File("D:\\");
        //將實現FilenameFilter介面的匿名類作為list()的引數
        String[] strArray = file.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".txt");
            }
        });
        for (String s : strArray) {
            System.out.println(s);
        }
    }
}
/*執行結果:
 * 摸金天師.txt
 * 盜墓筆記.txt
 * 鬼吹燈.txt
 * */

1.9 案例二:將D盤下的檔名稱批量重新命名

E:\電視劇\漢武大帝\漢武大帝001[電視劇迅雷下載電影天堂]_漢景帝削藩.avi,
改為:E:\評書\三國演義\001_漢景帝削藩.avi

public class FileRenameDemo {
    public static void main(String[] args) {
        //E:\電視劇\漢武大帝\漢武大帝_001_[電視劇_迅雷下載_電影天堂]_漢景帝削藩.avi
        File srcFolder = new File("E:\\電視劇\\漢武大帝");
        File[] fileArray = srcFolder.listFiles();
        for (File file : fileArray) {
            String name = file.getName(); 
            int index = name.indexOf("_");
            String numberString = name.substring(index + 1, index + 4);
            int endIndex = name.lastIndexOf('_');
            String nameString = name.substring(endIndex);

            String newName = numberString.concat(nameString);//001_漢景帝削藩.avi
            //System.out.println(newName);
            File newFile = new File(srcFolder, newName); 
            file.renameTo(newFile);
            //修改後:E:\評書\三國演義\001_漢景帝削藩.avi
        }
    }
}

2 路徑分隔符需要注意的問題

2.1 各系統的路徑分隔表示

Unix和Mac下的路徑分隔符為:【/ 】
DOS下的路徑分隔符為:【\】
Java可以正確處理Unix和Dos的路徑分隔符:
即使我們在Windows下使用(/)作為路徑分隔符,Java仍然能夠正確處理。
由於反斜線用來表示轉義字元,因此,表示路徑分隔符需用兩個反斜線。
在Java程式中我們使用\表示單反斜線(),使用\\表示雙反斜線(\).

2.2 程式設計中如何處理路徑分隔符

路徑分割符號問題,不同的作業系統不同,在程式中不要硬性編碼與平臺相關的任何常量.
可以使用File.separator得到不同系統下的路徑分隔符。
String sep = File.separator;
file = new File(“d:”+sep+”develop”, “data.txt”);

public class SeparatorDemo {
    public static void main(String[] args) {
        String sep = File.separator;
        File file =new File("E:"+sep+"E-Book"+sep+"leetcode-cpp刷題.pdf");
        System.out.println(file.getAbsolutePath());
    }
}
/*
 * E:\E-Book\leetcode-cpp刷題.pdf
 * */