A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.heima;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Set;
import java.util.TreeMap;

/*
* 6、 统计一个文本文件中字符出现的次数,结果存入另外的一个文本文件中。例如:

        a:  21 次
        b:  15 次
        c: 15 次
        把:  7 次
        当:  9 次
        前:  3 次
        ,:30 次

思路:
        采用键值对  方式存储
       
*/
public class Test06 {

        public static void main(String[] args) throws IOException {
                //创建一个HashSet集合和两个文件
                TreeMap<Character , Integer> hm = new TreeMap<Character , Integer>();
                // 创建打开两个字节流读写文件
                FileInputStream fis =new FileInputStream("111.txt");
                FileOutputStream fos = new FileOutputStream("222.txt");
       
                // 简化写法,建立BufferdReader和BufferedWriter两个缓冲
                BufferedReader bufr = new BufferedReader(new InputStreamReader(fis));
                BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(fos));
       
                //读取文件public int read(char[] cbuf)
                char[] ch = new char[1024];
                int len=0;
                while((len = bufr.read(ch))!=-1){
                       
                        for (int i= 0; i < ch.length; i++) {
                                       
                                //判断该字符是否为集合中的键
                                if (hm.containsKey(ch[i])) {
                                        //System.out.print(ch[i]);
                                        //获取该键对应的值
                                        int count = hm.get(ch[i]);
                                        //计数
                                        count++;
                                       
                                        //将该组键值对加入集合中
                                        hm.put(ch[i], count);
                                       
                                }else{
                                        hm.put(ch[i], 1);
                                }
                        }       
                }
               
                //关闭流
                bufr.close();

               
                //获取TreeMap中所有的键
                Set<Character> set = hm.keySet();
                               
                //全部读完后遍历集合
                for (Character key : set) {
                       
                        int num = hm.get(key);
                        String str = key+" : "+num+"次";
                        System.out.println(str);
                        bufw.write(str);//按指定格式写入缓冲区
                        //换行
                        bufw.newLine();
                        // 刷新,保存
                        bufw.flush();
                }
       
                //关流
                bufw.close();

        }

}

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

4 个回复

正序浏览
杜工 发表于 2014-10-4 07:08
换行和空格是两个特别需要注意的地方。

我好想明白了  每次的次数相加是1024    那就跟1024有关   
回复 使用道具 举报
换行和空格是两个特别需要注意的地方。
回复 使用道具 举报
波-wang 发表于 2014-10-3 22:13
package io;

import java.io.BufferedReader;

大神啊   果然是   谢谢  
回复 使用道具 举报
本帖最后由 波-wang 于 2014-10-3 22:27 编辑

package io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Set;
import java.util.TreeMap;

public class CharCount {

        public static void main(String[] args) throws IOException {

                TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

                coutToMap(tm);

                readMap(tm);
        }

        private static void readMap(TreeMap<Character, Integer> hm)
                        throws IOException {

                FileOutputStream fos = new FileOutputStream("E:/课程/222.txt");
                BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(fos));

                Set<Character> set = hm.keySet();
                for (Character key : set) {

                        int num = hm.get(key);
                        String str = key + " : " + num + "次";
                        // System.out.println(str);

                        bufw.write(str);
                        bufw.newLine();
                        bufw.flush();
                }

                bufw.close();
        }

        private static void coutToMap(TreeMap<Character, Integer> hm)
                        throws FileNotFoundException, IOException {

                FileInputStream fis = new FileInputStream("E:/课程/111.txt");
                BufferedReader bufr = new BufferedReader(new InputStreamReader(fis));

                /**
                 * 我的理解主要是这里有错误,
                 * 在记事本里写入数据时,我们并没有将记事本写满,
                 * 定义1024长度的数组时,因为数组长度不可变,
                 * 所以后面写入了很多空格
                 */

                char[] ch = new char[fis.available()];

                while (bufr.read(ch) != -1) {

                        for (int i = 0; i < ch.length; i++) {
                                if (hm.containsKey(ch)) {
                                        int count = hm.get(ch);
                                        count++;
                                        hm.put(ch, count);

                                } else {
                                        hm.put(ch, 1);
                                }
                        }
                }
                bufr.close();
        }
}

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马