在日常工作中經常會統計一些資料,下面介紹一個例子,如何統計某個目錄下邊各種檔案類型的檔案數量。
本例子使用到了遞歸的算法,字元串的常用運算,檔案的處理以及集合類的使用。是一個比較好的學習例子。
/**
* 統計某個目錄下所有各種檔案類型的數量
*/
public class StaticFile {
public static void main(String[] args) {
/**
*
*/
HashMap<String ,FileCnt> myFilemap = new HashMap<String ,FileCnt>();
staticFile(myFilemap,"D:\\untitled");
myFilemap.forEach((x,y)->{
System.out.println("filetype : " +x + " num :" + y );
});
}
/**
*
* @param fileMap
* @param filePath
*/
static void staticFile(HashMap<String ,FileCnt> fileMap,String filePath ){
File file = new File(filePath);
if (file.exists()){
// 如果是目錄 則遞歸調用
if(file.isDirectory()){
String[] list = file.list();
for (String afile:list) {
staticFile(fileMap,filePath + "\\" + afile );
}
// 如果是檔案 則處理map集合中的資料
}else {
// 擷取擴充名 以及檔案名稱
int lastgg = filePath.lastIndexOf("\\");
if (lastgg <=0 )
return;
// 得到檔案的名稱
String fileName = filePath.substring(lastgg+1);
// 沒有擴充名的情況
String suffix = "notype";
//擷取擴充名
if(fileName.lastIndexOf('.')>0){
try {
suffix = fileName.substring(fileName.lastIndexOf('.' )+1);
}catch (StringIndexOutOfBoundsException e){
System.out.println("filename error : " + fileName);
}
}
// 如果該類型已經存在于map中
// 則原有的基礎之上自增
// 否則建立新的對象儲存在map中
if (fileMap.get(suffix)==null){
fileMap.put(suffix,new FileCnt(suffix,1));
}else{
fileMap.get(suffix).increaseNum();
}
}
}
}
}
/**
* 儲存檔案類型與數目的結構
*/
class FileCnt{
String suffix;// 擴充名
int num;// 檔案的個數
@Override
public String toString() {
return "FileCnt{" +
"suffix='" + suffix + '\'' +
", num=" + num +
'}';
}
public FileCnt(String suffix, int num) {
this.suffix = suffix;
this.num = num;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void increaseNum() {
this.num++;
}
}