本帖最后由 蓝墨清幽 于 2015-4-22 16:54 编辑
- <p>
- </p><p>import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.Reader;
- import java.io.Writer;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;</p><p>public class Test16 {
- /*
- * 6.
- 题目:把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出,例如:</p><p> a: 21 次
- b: 15 次
- c:: 15 次
- 把: 7 次
- 当: 9 次
- 前: 3 次
- ,: 30 次
- */
- public static void main(String[] args) {
- /*
- * 调用文件读写的方法,返回一个Map集合
- * 第一个参数目录名
- * 第二个参数目标txt文件名
- */
- Map<Character,Integer> map = copy("c:\\","copy.txt");
-
- /*
- * 对Map集合进行遍历,并输出
- */
- Set<Entry<Character,Integer>>entrySet = map.entrySet();
- Iterator<Entry<Character, Integer>> it = entrySet.iterator();
- while(it.hasNext()){
- Entry<Character,Integer> entry = it.next();
- System.out.println(entry.getKey()+":"+entry.getValue()+"次");
- }
- }</p><p> /*
- * 文件复制
- */
- private static Map<Character, Integer> copy(String dirname, String filename) {
- //创建Map
- Map<Character,Integer> map = new HashMap<Character,Integer>();
- //创建目录file对象
- File dir = new File(dirname);
- //判断是否是目录
- if(dir.isDirectory()){
- //创建目标txt文件file对象
- File file = new File(dirname, filename);
- try {
- //创建输出流,因为输出流要输出多个文件的内容,所以在for循环外边
- Writer out = new FileWriter(file);
- //获取目录下面的所有文件及文件夹
- File[ ] files = dir.listFiles();
- for(int i=0;i<files.length;i++){
- //判断file为文件而不是文件夹,并且是txt文件
- if(files[i].isFile()&&files[i].getName().endsWith(".txt")){
- //关联txt文件,创建输入流
- Reader in = new FileReader(files[i]);
- int cbuf = 0;
- /*
- * 开始读取文件, cubuf每次读取一个字符对应int型数值,
- * 文件结尾in.read()返回-1;
- */
- while((cbuf=in.read())!=-1){
- //将每个字符出现的次数,添加到Map集合
- add(map, cbuf);
- //效率太低求改进
- out.write(cbuf);
- }
- //刷新缓冲区
- out.flush();
- //关闭输入流
- in.close();
- }
- }
- //所有文件输出完毕,关闭输出流
- out.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return map;
- }
- /*
- * 给Map添加字符出现的次数
- */
- private static void add(Map<Character, Integer> map, int cbuf) {
- //先获取Map集合该字符出现的次数
- Integer value = map.get((char)cbuf);
- //如果为null表明字符第一次出现value=1;
- if(value==null){
- value=1;
- }else{
- //否则字符出现次数+1
- value++;
- }
- //添加到集合
- map.put((char) cbuf, value);
- }
- }
- </p>
复制代码 文件读写的时候,是一个字符写一次效率太低,求改进
关于Map的使用见
【技术问题】Map及HashMap的使用-黑马程序员IT技术论坛
http://bbs.itheima.com/forum.php?mod=viewthread&tid=190044&page=1#pid1376424
|
|