二、列出指定目錄下的檔案(包括子目錄)
阿新 • • 發佈:2019-01-30
當File物件指向一個目錄時,可以通過File物件來獲取目錄下的檔案資訊。
1、File類的list方法返回該目錄下所有檔案(包括目錄)的檔名,檔名不包含路徑資訊。
2、File類的listFile方法返回該目錄下所有檔案(包括目錄)的File物件
3、FilenameFilter是檔名過濾器介面類,所有自定義的檔名過濾器必須實現改介面的accept方法
例項演示
package book.io; import java.io.File; import java.io.FilenameFilter; public class ListFileUtil ...{ /** *//** 這是一個內部類,實現了FilenameFilter介面,用於過濾檔案 */ static class MyFilenameFilter implements FilenameFilter ...{ private String surfix = ""; //檔名字尾 public MyFilenameFilter(String surfix) ...{ this.surfix = surfix; } public boolean accept(File dir, String name) ...{ //如果檔名與surfix指定的字尾相同,便返回true,否則返回false if(new File(dir, name).isFile()) ...{ return name.endsWith(surfix); } else ...{ //如果是資料夾,則直接返回true return true; } } } /** *//** * 列出目錄下所有檔案包括子目錄的檔案路徑 * @param dirName 資料夾的檔案路徑 */ public static void listAllFiles(String dirName) ...{ //如果dir不以檔案分隔符結尾,自動新增檔案分隔符 if (!dirName.endsWith(File.separator)) ...{ dirName = dirName + File.separator; } File dirFile = new File(dirName); //如果dir對應的檔案不存在,或者不是一個資料夾,則退出 if (!dirFile.exists() || (!dirFile.isDirectory())) ...{ System.out.println("List失敗!找不到目錄:" + dirName); return; } //列出原始檔夾下所有檔案(包括子目錄) File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) ...{ if (files[i].isFile()) ...{ System.out.println(files[i].getAbsolutePath() + " 是檔案!"); } else if (files[i].isDirectory()) ...{ System.out.println(files[i].getAbsolutePath() + " 是目錄!"); ListFileUtil.listAllFiles(files[i].getAbsolutePath()); } } } /** *//** * 列出目錄中通過檔名過濾器過濾後的檔案 * @param filter 檔名過濾器物件 * @param dirName 目錄名 */ public static void listFilesByFilenameFilter(FilenameFilter filter, String dirName) ...{ //如果dir不以檔案分隔符結尾,自動新增檔案分隔符 if (!dirName.endsWith(File.separator)) ...{ dirName = dirName + File.separator; } File dirFile = new File(dirName); //如果dir對應的檔案不存在,或者不是一個資料夾,則退出 if (!dirFile.exists() || (!dirFile.isDirectory())) ...{ System.out.println("List失敗!找不到目錄:" + dirName); return; } //列出原始檔夾下所有能通過過濾器的檔案(包括子目錄) File[] files = dirFile.listFiles(filter); for (int i = 0; i < files.length; i++) ...{ if (files[i].isFile()) ...{ System.out.println(files[i].getAbsolutePath() + "是檔案!"); } else if (files[i].isDirectory()) ...{ System.out.println(files[i].getAbsolutePath() + "是目錄!"); ListFileUtil.listFilesByFilenameFilter(filter, files[i].getAbsolutePath()); } } } public static void main(String[] args) ...{ String dir = "D:/work/JavaExample"; System.out.println(dir + " 目錄下的內容:"); ListFileUtil.listAllFiles(dir); System.out.println(); System.out.println("經過過濾器過濾後的內容"); //新建一個過濾器,引數為".java" FilenameFilter myFilenameFilter = new ListFileUtil.MyFilenameFilter(".java"); ListFileUtil.listFilesByFilenameFilter(myFilenameFilter, dir); } }
原始碼分析:
MyFilenameFilter類是一個自定義的檔名過濾器,實現了FilenameFilter介面。屬性surfix表示檔案過濾器支援的檔名字尾,在accept方法中,如果檔名的字尾為surfix,則返回true,表示檔案能通過過濾器。如果是目錄則直接通過。
listFilesByFilenameFilter方法列出目錄下滿足檔名過濾器的所有檔案的絕對路徑。在使用File的listFile方法時指定檔名過濾器物件,它只返回能通過檔名過濾器的File物件。