//FileReader.java
package com.xie.tencent;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
/**
* 这是tencent2010-10-10的java笔试最后一题。
* 读取某个文件夹及其子文件夹的*.txt文件,输出所有文件名
* 同时,需要读取文件中出现的单词,并统计各个单词出现的个数,
* 在文件中以","分隔,也可以是其它分隔符号。
* @author centre
*
*/
/*
* 这个类实现分析文件夹中所包含的.txt文件,并提供方法输出文件名
*/
public class FileReader {
/**
* 根据传入参数,找到需要的文件类型,算法:递归
* @author centre
* @param baseDirName 文件目录(可以是一个目录,也可以是一个文件)
* @param targetFileName 需要查找的文件的类型(正则表达式)
* @param resultFiles 相关文件的list的集合
*/
public void findFiles(String baseDirName,String targetFileName,List<File> resultFiles){
String tmpFileName=null;
Pattern p=null;
File baseDir=new File(baseDirName);
if (!baseDir.exists()) {
System.out.println("文件或者文件夹"+baseDirName+"不存在。");
return;
}
if (baseDir.isDirectory()) {
//如果baseDir是文件夹,递归分析该文件夹
String[]fileList=baseDir.list();
for (int i = 0; i < fileList.length; i++) {
//File readfile = new File(baseDirName + "//" + filelist[i]);//注意//和/的区别
File readFile=new File(baseDirName+"/"+fileList[i]);
if (readFile.isDirectory()) {
findFiles(baseDirName + "/" + fileList[i],targetFileName,resultFiles);
}else {
tmpFileName=readFile.getName();
p= Pattern.compile(targetFileName);
if (p.matcher(tmpFileName).matches()) {
resultFiles.add(readFile.getAbsoluteFile());
}
}
}
}else {
//如果baseDir不是文件夹,直接匹配该文件
tmpFileName=baseDir.getName();
p= Pattern.compile(targetFileName);
if (p.matcher(tmpFileName).matches()) {
resultFiles.add(baseDir.getAbsoluteFile());
}
}
}
/**
* @author centre
* @param aList 存放找到文件的集合
* @return 一个hashMap 存放文件中的单词,及单词个数
*/
public HashMap<String, Integer> count(List<File> aList){
CounterWord cw=new CounterWord(this);
for (int i = 0; i < aList.size(); i++) {
File f=aList.get(i);
cw.openFile(f.getAbsolutePath());
//System.out.println("文件"+(i+1)+":"+f.getAbsolutePath());
}
return cw.gethMap();
}
public static void main(String[] args) {
FileReader fr=new FileReader();
List<File> aList=new ArrayList<File>();
String base="D://project//TencentLast//files";//files(test1.txt,test2.txt,filetest1(test3.txt,test4.txt filetest2)(test5.txt,test6.txt))*.txt文件中的单词以逗号隔开
String fileEndRex="//w.+txt$)";//(.txt文件的正则表达式
fr.findFiles(base,fileEndRex, aList);
HashMap<String,Integer> hMap=fr.count(aList);
Set<String> hset=hMap.keySet();
for (Iterator<String> iterator = hset.iterator(); iterator.hasNext();) {
String word = (String) iterator.next();
System.out.println("word:"+word+" "+hMap.get(word));
}
}
}
//CountWord.java
package com.xie.tencent;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
/**
* 这个类用于统计某个单词在所有文件中出现的次数。
* @author centre
*
*/
public class CounterWord {
FileReader fr;
private HashMap<String, Integer> hMap=new HashMap<String, Integer>();;
public HashMap<String, Integer> gethMap() {
return hMap;
}
/**
* 这个构造方法用于持有对方引用
* @author centre
* @param f FileReader
*/
public CounterWord(FileReader f) {
fr=f;
}
/**
* 根据传入的文件路径,打开文件,同时分析其中的单词个数,
* 存放进一个HashMap
* @author centre
* @param path String 文件的绝对路径
* @return 返回值貌似没用,在需要时可以接收
*/
public boolean openFile(String path){
boolean b=true;
try {
FileInputStream fis=new FileInputStream(path);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
try {
String words=br.readLine();
while (words!=null) {
//System.out.println(words);
String[] word=words.split(",");
for (int i = 0; i < word.length; i++) {
addWordCount(word[i]);
}
words=br.readLine();
}
} catch (IOException e) {
System.out.println("文件读取异常。");
e.printStackTrace();
}
} catch (FileNotFoundException e) {
System.out.println("没有找到该文件:"+path);
b=false;
e.printStackTrace();
}
return b;
}
/**
* 将单词放进map,同时统计单词出现的次数
* @param word String 单词
*/
private void addWordCount(String word) {
if (hMap.containsKey(word)) {
hMap.put(word, hMap.get(word).intValue()+1);
}else {
hMap.put(word, 1);
}
}
}