1. 程式人生 > >java IO File類和FilenameFilter檔名稱過濾器

java IO File類和FilenameFilter檔名稱過濾器

File類

Java檔案類以抽象的方式代表檔名和目錄路徑名,定義了一些與平臺無關的方法來操作檔案,可以通過呼叫File類中的方法,實現建立、刪除、重新命名檔案等。File物件代表磁碟中實際存在的檔案和目錄.

構造方法:

File(String pathname)  通過將給定路徑名字字串轉換為抽象路徑來建立一個File物件。

File(String parent, String child) 根據給定的父路徑和子路徑的字串(可包含檔名)建立一個File物件

File(File parent, String child)通過給定的父抽象路徑名和子路徑名字串建立一個File物件。

File(URI uri) 通過將給定的 URI 轉換成一個抽象路徑名來建立一個File物件。

常用方法,建立檔案或者資料夾,如果沒有寫碟符路徑,預設在專案路徑裡面建立

public boolean createNewFile() throws IOException,當File物件不存在時,建立一個File物件(File物件的路徑下)的檔案,返回true,當File物件對應的檔案存在時,不建立,返回false

public boolean mkdir() 建立File物件的抽象路徑名指定的目錄資料夾,只建立路徑最後的那個資料夾,比如"I:\\hello\world"。如果hello資料夾不存再,則不會建立world資料夾,hello資料夾存在,world才能建立.
 public boolean mkdirs()建立此抽象路徑名指定的目錄,包括建立必需但不存在的父目錄。這兩個方法只能建立目錄,不管File物件的路徑名以什麼結尾,比如"I:\\hello\\world.doc",會建立多層資料夾,最後一層資料夾的名字是world.doc,注意不是word文件

 

重新命名或者刪除檔案/資料夾

public boolean renameTo(File dest)對文見的抽象路徑名進行重新命名,引數是File物件,而不是字串,如果兩個File物件的路徑不相同,則會將被修改的檔案進行剪下,然後再重新命名放到新的路徑裡面

public boolean delete()刪除File物件對應的檔案或者資料夾,刪除時不會放入回收站,當File物件是資料夾時,要確保被刪除的資料夾裡面沒有其他檔案才可以進行刪除成功

判斷方法:

public boolean isDirectory():判斷File物件是否是目錄

public boolean isFile():判斷File物件是否是檔案

public boolean exists():判斷File物件是否存在

public boolean isHidden():判斷File物件是否被隱藏

其他常用方法

public String getName()返回檔案或目錄的名稱,如果建立File物件時傳入的路徑有多級路徑,只顯示最後一層

 public String getPath()獲取File物件的路徑名組成的字串,即建立物件時傳入的路徑(絕對路徑或者相對路徑)

public String getAbsolutePath():獲取File物件的絕對路徑

public long length():獲取File物件對應檔案的大小。返回位元組數

public long lastModified():獲取最後一次的修改時間,毫秒值,可格式化成時間

public String[] list():獲取檔案路徑(同一層級目錄)下所有檔名)

public String[] list(FilenameFilter filter)獲取檔案路徑(同一層級目錄)下的通過滿足指定過濾器的檔名/資料夾名組成的字串陣列

public File[] listFiles():獲取檔案路徑下同級檔案的File物件陣列

public File[] listFiles(FileFilter filter)獲取檔案路徑下同級檔案的滿足特定過濾器的File物件陣列
 

建立,刪除,重新命名檔案/資料夾示例:

import java.io.File;
import java.io.IOException;

public class FileTest01 {
    public static void main(String[] args) throws IOException {
    File f1=new File("I:\\java.doc");
    System.out.println( f1.createNewFile());
    //不寫碟符,會在工程目錄下建立資料夾
    File f2=new File("hello.txt");
    f2.mkdir();
    File f3=new File("I:\\hello\\world");
    //mkdir只建立最後的一層資料夾,不管路徑最後以什麼結尾,都會是資料夾
    f3.mkdir();
    File f4=new File("I:\\world\\hello.txt");
    //mkdirs建立多層資料夾
    f4.mkdirs();
    //將I:\java.doc重新命名成javase.doc
    File f5=new File("I:\\java.doc");
    File f6=new File("I:\\javase.doc");
    f5.renameTo(f6);
    //將javase.doc剪下到不同的目錄下,並重命名
    File f7=new File("I:\\javase.doc");
    File f8=new File("I:\\world\\hello.txt\\javaSpring.txt");
    f7.renameTo(f8);
    File f9=new File("I:\\world");
    //刪除檔案或者資料夾,如果目錄下有檔案或者資料夾,不會刪除
    System.out.println( f9.delete());
    File f10=new File("hello.txt");
    f10.delete();

    }
}

判斷方法和其他常用方法的示例:


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileTest02 {
    public static void main(String[] args){
        File   f1=new File("i:\\java.doc");
        //判斷是否為資料夾
        System.out.println( f1.isDirectory());
        //判斷是否為檔案
        System.out.println( f1.isFile());
        //判斷是否是隱藏的
        System.out.println( f1.isHidden());
        //判斷是否存在
        System.out.println( f1.exists());
        //建立一個路徑不存在的File物件
        File f2=new File("i:\\helloworld");
        System.out.println( f2.isDirectory());
        System.out.println( f2.isFile());
        System.out.println( f2.isHidden());
        System.out.println( f2.exists());

        File f3=new File("2.txt");
        //返回檔案/資料夾的名字
        System.out.println( f3.getName());
        //返回路徑
        System.out.println( f3.getPath());
        //返回絕對路徑
        System.out.println( f3.getAbsolutePath());
        //返回檔案的大小,以位元組計算
        System.out.println( f3.length());
        //獲取最後一次修改時間,返回long型別,需要轉換成Data型別
        long dat=f3.lastModified();
        Date date=new Date(dat);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS");
        System.out.println( sdf.format(date));

        File f4=new File("i:\\world\\hello.txt\\javaSpring.txt");
        System.out.println( f4.getName());
        System.out.println( f4.getPath());
        System.out.println( f4.getAbsolutePath());
        System.out.println( f4.length());
        System.out.println( "-------------------------------------");
        File f5=new File("e:\\workspace\\javaIo");
        //獲取路徑下面同級檔案/資料夾的名稱,以String陣列返回
        String[] strs=f5.list();
        for (String str:strs){
            System.out.println( str);
        }
        //獲取路徑下面統計檔案/資料夾的File物件陣列
        File [] files=f5.listFiles();
        //打印出檔案的絕對路徑
        for (File file:files){
            System.out.println( file);
        }
        
    }
}

練習1:統計專案根目錄下的檔名中以.txt結尾的檔案個數,並將其打印出來

 

 專案檔案關係如右圖

import java.io.File;
//考慮到資料夾也可能以.txt結尾命名,所以要判斷名稱字尾還要判斷是不是檔案型別
public class FileTest03 {
    public static void main(String[] args){
        File f1=new File("e:\\workspace\\javaIo");
        File [] files=f1.listFiles();
        int count=0;
        for(File file:files){
            if ( file.getName().endsWith(".txt")){
                if(file.isFile()) {
                    count++;
                    System.out.println(file.getName());
                }
            }
        }
    }
}
out:
1.txt
2.txt
word.txt
word1.txt

練習2: 統計工程目錄下所有的txt檔案個數,並打印出絕對路徑,檔案目錄如下:

程式碼示例:

import java.io.File;

public class FileTest04 {
    static int count=0;//靜態方法可以直接呼叫靜態成員變數
    public static void main(String[] args){
        File f=new File("e:\\workspace\\javaIo");

        ReadFile(f,".txt");
        System.out.println( "共有"+count+"個txt檔案");
    }
    public static void ReadFile(File f,String endMark){
        File[] fileArr=f.listFiles();
        for (File file :fileArr){
            if (file.isDirectory()){
                ReadFile(file,endMark);
            }else{
                if (file.isFile()&&file.getName().endsWith(endMark)){
                        System.out.println( file.getAbsoluteFile());
                        count++;
                }
            }
        }
    }

}
out:
e:\workspace\javaIo\1.txt
e:\workspace\javaIo\2.txt
e:\workspace\javaIo\test\test.txt
e:\workspace\javaIo\test\test0.txt
e:\workspace\javaIo\test\test1.txt
e:\workspace\javaIo\test\test2.txt
e:\workspace\javaIo\test\test3.txt
e:\workspace\javaIo\test\test4.txt
e:\workspace\javaIo\test\test6.txt
e:\workspace\javaIo\test\test7.txt
e:\workspace\javaIo\word.txt
e:\workspace\javaIo\word1.txt
共有12個txt檔案

FilenameFilter檔名稱過濾器

File類的list方法的過載方法和listFiles方法的過載方法中,有一個引數FilenameFilter例項

public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)

FilenameFilter是java.io包下的一個介面,只有一個方法,兩個引數第一個引數是File物件(代表到某個資料夾),第二個引數是檔名(呼叫list方法得到的檔名),兩個引數拼接下(呼叫File類構造器File(File parent, String child)得到parent資料夾下的某個檔案/資料夾的File物件),就得到了目錄下某個檔案的File物件,根據File物件編寫條件來返回布林值,決定list返回的字串陣列中是否過濾掉某些File物件的檔名,或者listFiles返回的File陣列中是否過濾掉某些物件

public interface FilenameFilter {
    boolean accept(File dir, String name);
}

以list方法來看:File類中list過載方法的原始碼(jdk11)

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

以練習1中統計工程目錄下txt檔案的數量,並打印出txt檔案的檔名為例來演示:

import java.io.File;
import java.io.FilenameFilter;

public class FileTest05 {
    public static void main(String[] args){
     File f=new File("e:\\workspace\\javaIo");
     String [] nameArr=f.list(new FilenameFilter() {
         @Override
         public boolean accept(File dir, String name) {
             File f1=new File(dir,name);
             if (f1.isFile()&&f1.getName().endsWith(".txt")){
                 return true;
             }
             return false;
         }
     });
     System.out.println("當前工程根目錄下的txt檔案有"+nameArr.length+"個");
     for (String name:nameArr){
         System.out.println( name);
     }

    }
}
out:
當前工程根目錄下的txt檔案有4個
1.txt
2.txt
word.txt
word1.txt