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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敗唫①輩ふ 中级黑马   /  2013-11-8 23:48  /  1125 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/** * 第七题:已知文件a.txt文件中的内容为“bcdeadferwplkou”, * 请编写程序读取该文件内容,并按照自然顺序排序后输出到b.txt文件中。 * 即b.txt中的文件内容应为“abcd…………..”这样的顺序。 *  *//**
*  思路:
  1.创建一个List集合
* 2.将原文件中的字母添加到集合中
* 3.使用Collections工具类的sort方法 对List集合进行排序
* 4.将集合中的元素写入目标文件中
*
*/

/**
* Test7类
* 实现题目需求
* sortAndCopyFile()方法:将原文件中的内容排序后复制到目标文件中
* write2File()方法:将排序后的List集合中的元素写入目标文件中
* getList()方法:将原文件中的字母添加到集合中并对集合排序后返回集合对象。
* getOutputStream():获取指定目标文件的输出流
*/
public class Test7 {
       
        /**
         * 将原文件中的内容排序后复制到目标文件中
         * @param srcFilePath 原文件路径
         * @param destFilePath 目标文件路径
         */
        public static void sortAndCopyFile(String srcFilePath,String destFilePath) {
                //获取对原文件内容排序后的List集合
                List<Character> list = getList(srcFilePath);
               
                //获取指定目标文件的输出流
                OutputStream ops = getOutputStream(destFilePath);
               
                //将集合中的元素写入目标文件中
                write2File(list,ops);
        }
       

       
        /**
         * 将原文件中的字母添加到集合中并对集合排序后返回集合对象。
         * 实现步骤一,二,三
         * @param srcFilePath 原文件路径
         * @return 返回已排序的List集合
         */
        private static List<Character> getList(String srcFilePath) {
                FileInputStream fis =null;
                BufferedReader br = null;
               
                /*步骤一:创建一个List集合*/
                List<Character> list = new ArrayList<Character>();;
                try {
                        fis = new FileInputStream(srcFilePath);
                        br = new BufferedReader(new InputStreamReader(fis));
                        int b = -1;
                       
                        while((b=br.read())!=-1) {
                                char ch = (char)b;
                                /*步骤二:将文件中的字母添加到集合中*/
                                list.add(ch);
                        }
                } catch (FileNotFoundException e) {
                        new RuntimeException("文件没有找到!");
                } catch (IOException e) {
                        new RuntimeException("文件读取失败!");
                }finally {
                        try {
                                if(br!=null)
                                        br.close();
                        } catch (IOException e) {
                                new RuntimeException("读取流关闭失败!");
                        }
                }
               
                /*步骤三:使用Collections工具类的sort方法 对List集合进行排序*/
                Collections.sort(list);
               
                return list;
        }
       
        /**
         * 获取指定目标文件的输出流
         * @param destFilePath 目标文件路径
         * @return 返回指定目标文件的输出流
         */
        private static OutputStream getOutputStream(String destFilePath) {
                //创建目标文件对象
                File file = new File(destFilePath);
               
                //如果目标文件不存在,程序终止
                if(!file.exists())
                        throw new RuntimeException("文件不存在");
               
                OutputStream output= null;
                try {
                        //获取指定目标文件的输出流
                        output = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                        new RuntimeException("文件没有找到!");
                }
               
                return output;
        }
       
        /**
         * 将集合中的元素写入目标文件中
         * 实现步骤四
         * @param list 对文件内容进行排序的集合
         * @param ops  指定目标文件的输出流
         */
        private static void write2File(List<Character> list,OutputStream ops) {
                /*为了提高效率使用缓冲写入流*/
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ops));
               
                try {
                       
                        //遍历List集合,也可使用迭代器,将List集合中的元素写入目标文件中
                        for(char ch : list) {
                                System.out.println(ch);
                                /*第四步:将集合中的元素写入缓冲写入流中,通过缓冲流的刷新写入到文件中*/
                                bw.write(ch);
                        }
                } catch (IOException e) {
                        new RuntimeException("写入文件失败!");
                }finally {
                        /*关闭流资源并刷新缓冲写入流,需要异常处理*/
                        try {
                                if(bw!=null)
                                        bw.close();
                        } catch (IOException e) {
                                new RuntimeException("写入流关闭失败!");
                        }
                }
        }
       
        /**
         * 主函数进行功能测试
         * 指定已知文件路径srcFilePath和目标文件路径destFilePath
         * 调用sortAndCopyFile方法将已知文件内容按需求复制到目标文件中
         */
        public static void main(String[] args) {
                //定义已知文件路径
                String srcFilePath = "src\\com\\itheima\\resources\\a.txt";
               
                //定义目标文件路径
                String destFilePath = "src\\com\\itheima\\resources\\b.txt";
               
                //功能测试,已知文件内容按需求复制到目标文件中
                sortAndCopyFile(srcFilePath,destFilePath);
        }
       
}

以上代码是我做的一个考试题,但是我总感觉我有什么地方用的比较麻烦,哪位高手帮我看看,能不能让代码更优化,高效。。小弟感激不尽!



评分

参与人数 1技术分 +2 收起 理由
wym + 2 赞一个!

查看全部评分

2 个回复

倒序浏览
读取文件一般获得的是 char[] 或者 byte[]
直接用 Arrays.sort 就可以,不需要用到集合吧
回复 使用道具 举报
首先,楼主的写代码的习惯、格式很好,值得大家学习。
我的看法:
你的程序我运行了一下,并试着改了一下,我觉得能进行优化的地方就是那个把读取到的字符进行排序的地方,就是那个getList方法,我修改后的代码是把List集合换成了TreeSet集合,这个集合在放置字符数据的同时可以自动自然排序。Character类本身实现了Comparable接口,自身具有比较的方法。
这是我修改后的方法
private static TreeSet<Character> getList(String srcFilePath) {
                FileInputStream fis =null;
                BufferedReader br = null;
               
                TreeSet<Character> set = new TreeSet<Character>();;
                try {
                        fis = new FileInputStream(srcFilePath);
                        br = new BufferedReader(new InputStreamReader(fis));
                        int b = -1;
                        
                        while((b=br.read())!=-1) {
                                char ch = (char)b;
                                /*步骤二:将文件中的字母添加到集合中*/
                                set.add(ch);
                        }
                } catch (FileNotFoundException e) {
                        new RuntimeException("文件没有找到!");
                } catch (IOException e) {
                        new RuntimeException("文件读取失败!");
                }finally {
                        try {
                                if(br!=null)
                                        br.close();
                        } catch (IOException e) {
                                new RuntimeException("读取流关闭失败!");
                        }
                }
               
                return set;
        }

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

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