java面试题之使用IO字符流操作文本文件

本文介绍两种实用的文件操作方法:一种是实现文件内容的反转,即首尾行互换;另一种是统计文件中每个字符出现的频率,并将结果输出到另一个文件。

1.将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换

    /**
     * 将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换
     * 使用高效字符流按行读取,然后放入集合中,倒着遍历集合,将读取的内容输出到文本中
     */
    @Test
    public void reversalFile(){
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            String sourceFileUrl = "C:\\Users\\admin\\Desktop\\testIO\\a.txt";
            String targetFileUrl = "C:\\Users\\admin\\Desktop\\testIO\\b.txt";
            reader = new BufferedReader(new FileReader(sourceFileUrl));
            writer = new BufferedWriter(new FileWriter(targetFileUrl));
            ArrayList<String> list = new ArrayList<>();
            String line;
            while ((line=reader.readLine())!=null){
                list.add(line);
            }
            //反向遍历集合,输出内容
            for (int i=list.size()-1; i>=0;i--){
                writer.write(list.get(i));
                writer.newLine();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //在finally中关闭开启的流
            if (reader!=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

2.获取一个文本上每个字符出现的次数,将结果写在b.txt上

    /**
     * 获取一个文本上每个字符出现的次数,将结果写在b.txt上
     */
    @Test
    public void statCharCountInFile(){
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            String sourceFileUrl = "C:\\Users\\admin\\Desktop\\testIO\\a.txt";
            String targetFileUrl = "C:\\Users\\admin\\Desktop\\testIO\\b.txt";
            reader = new BufferedReader(new FileReader(sourceFileUrl));
            writer = new BufferedWriter(new FileWriter(targetFileUrl));
            Map<Character,Integer> map = new TreeMap<>();
            int c;
            while ((c=reader.read())!=-1){
                //将读取到的内容强转为char类型,判断map集合中是否已存在,存在,value+1,不存在,value初始化为1
                char key = (char) c;
                map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
            }
            //遍历集合,将结果写入b.txt中,注入特殊字符转换
            for (Character key : map.keySet()) {
                switch (key){
                    case '\t':
                        writer.write("\\t出现了:"+map.get(key)+"次");
                        break;
                    case '\r':
                        writer.write("\\r出现了:"+map.get(key)+"次");
                        break;
                    case '\n':
                        writer.write("\\n出现了:"+map.get(key)+"次");
                        break;
                    default:
                        writer.write(key+"出现了:"+map.get(key)+"次");
                }
                writer.newLine();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //在finally中关闭开启的流
            if (reader!=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值