您的位置:首页 > 其它

收索文件夹及子文件夹下的txt,并统计txt文件的单词出现的个数

2010-10-10 18:17 423 查看
//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=")";//(.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);
  }
 }
 
    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐