1. 程式人生 > >Java File類學習筆記4:自定義一個類,過濾指定副檔名的檔案

Java File類學習筆記4:自定義一個類,過濾指定副檔名的檔案

一、FilenameFilter介紹

java.io.File類提供了四個方法用於列舉某個路徑下的檔案和目錄,但不會遞迴列舉子目錄下的內容

其中兩個是列舉路徑下的所有檔案和目錄。

(1)String[]files = f.list();

(2)File[]files = f.listFiles();

另外兩個是列舉路徑滿足指定過濾器的檔案和目錄。

(1)String[]fs  =  f.list(FilenameFilter filter);

(2)File[]fs = f.listFiles(FileFilter filter);

java.io.FilenameFilter是檔名過濾器,用來過濾不符合規格的檔名,並返回合格的檔案;

FilenameFilter用來把符合要求的檔案或目錄返回;

二、檔名過濾器一般用法

1.實現FilenameFilter介面;

2.覆寫accept方法boolean accept(File dir,String name); //dir表示檔案的當前目錄,name表示檔名;

三、例項  

自定義一個類,繼承FileNameFilter類,獲得某一目錄下所有指定副檔名的檔案。

方法一:

/** 
 * 說明: 
 * 自定義FilterByJava類,過濾指定副檔名的檔案 
 *  
 */  
import java.io.File;
import java.io.FilenameFilter;

public class FilterByJava implements FilenameFilter {
	private String ext; // ext為需要過濾的條件,比如如果ext =".jpg",則只能返回字尾為jpg的檔案

	public FilterByJava(String ext) {
		this.ext = ext;
	}

	public boolean accept(File dir, String name) { // 返回true的檔案則合格
		return name.endsWith(ext);
	}
}

方法二:

FilenameFilter是一個介面,所以需要寫一個實現類來實現該介面。我希望實現了該介面的類,可以過濾多種檔案型別。示例程式碼如下:

package com.daxiang.filter;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FileFilterTool implements FilenameFilter {

	List<String> types;

	protected FileFilterTool() {
		types = new ArrayList<String>();
	}

	protected FileFilterTool(List<String> types) {
		super();
		this.types = types;
	}

	public boolean accept(File dir, String filename) {
		// TODO Auto-generated method stub
		for (Iterator<String> iterator = types.iterator(); iterator.hasNext();) {
			String type = (String) iterator.next();
			if (filename.endsWith(type)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 新增指定型別的檔案。
	 * 
	 * @param type 要新增的檔案型別,如".jpg"。
	 */
	public void addType(String type) {
		types.add(type);
	}
}

在以上程式碼中,為FilenameFilter物件添加了一個成員變數types,以接收指定型別。方法addType(Stringtype)是為過濾器新增需要過濾的檔案型別,其內容為檔案的字尾名,如".jpg"。

public boolean accept(File dir, String filename)是實現FilenameFilter介面時要重寫的方法,用迴圈迭代判斷檔名的字尾名是否為types中的型別,是則返回true。當types中沒有該檔案的字尾名時,返回false。

  在定義的類中,構造方法寫了兩個,一個是不帶引數的,此時自己建立一個ArrayList物件,用以儲存檔案型別。另一個是帶List物件引數的,該物件由使用者建立。

    使用時程式碼如下:

package com.daxiang.filter;

import java.io.File;

public class Test {
	public static void main(String args[]){
		String path = "d:\\daxiang";
		File file = new File(path);  
		FileFilterTool filenameFilter = new FileFilterTool();  
		filenameFilter.addType(".jpg");  
		filenameFilter.addType(".mp3");  
		File[] files = file.listFiles(filenameFilter);  
		for (int i = 0; i < files.length; i++) {  
		    System.out.println(files[i].getName());  
		}  
	}
}