疯狂Java学习笔记(021)

--------------------------------------------------------------

练习:

题1:有一个文本文件如下,数字之间空格分隔

  将其中的数字实现倒序排列并保存到另一个文本文件中,一个数字一行

  9 5 2 7

  6 5 2

结果文件:

9

7

6

5

5

2

2

public static void main(String[] args) throws Exception {
    //读取数据
    BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    
    //
    TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);
        }
    });
    
    int x = 0;
    //
    String line = null;
    while((line = br.readLine()) != null){
        String[] split = line.split(" ");
        //放到集合中时,不能只放数字,需要让它唯一.
        //数字_数字
        for (String n : split) {
            set.add(n+"_"+x++);//9_0    9_1
        }
    }
    //
    br.close();
    
    //创建输出流
    FileWriter fw = new FileWriter("b.txt");
    //变量集合,将元素中的数字写出到文件中
    for(String n : set){
        fw.write(n.split("_")[0]);
        //换行
        fw.write("\r\n");
    }
    //
    fw.close();
}

 

题2:一个文本文件的内容如下:

001 toms 10

002 Tyson 20

003 Jerry 12

其中的内容一行表示的是一个学生对象的基本信息,信息用空格分隔

尝试将其中的文本信息解析成学生对象,并保存在一个学生集合中

public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader("stu.txt"));
    
    //
    ArrayList<Student> list = new ArrayList<Student>();
    
    String line = null;
    while((line = br.readLine()) != null){
        String[] info = line.split(" ");
        String id = info[0];
        String name = info[1];
        int age = Integer.parseInt(info[2]);
        
        //
        Student s = new Student(id, name, age);
        list.add(s);
    }
    br.close();
    
    //
    for (Student stu : list) {
        System.out.println(stu);
    }
}

 

练习题:

1.将集合中的元素保存到文件中
重点:
    集合的遍历,输出流的选择:由于一般都是文本文件,并且一个元素占用一行,所以最好选择缓冲字符流,可以方便实现换行.
    
2.将文件中的数据读取到集合中
重点:
    集合的选择!由于文件中的内容有可能是重复的,在选择集合的时候,就不能选择元素是唯一的集合,那样,将导致文件内容的丢失!

3.将两个路径的文件进行汇总!
重点:
    汇总的文件输出流必须在所有的文件都合并完之后再关闭,不能提前关闭!

4.随机获取文本文件的一行
重点:
    文本文件中的内容只能是顺序读取,而集合中的元素是可以随机的获取的,所以需要将文件中的行转换成集合中的元素.

5.复制单级文件夹下的文件
重点:
    流的选择:由于文件的类型多种,并不固定是文本文件,所以在流的选择上,应该使用万能的字节流.

6.复制多级文件夹下的所有文件
重点:
    递归的方法调用!

java第二API:commons-io.
https://mvnrepository.com/ -> 互联网上jar包的仓库!!!配合maven使用!


7.复制指定类型文件并改名
重点:
    指定类型的文件判断:对文件名必须转换成统一的大小写再使用endsWith方法判断!
    改名:使用renameTo方法需要注意必须在同一个文件夹下才是改名!

 

8.录入名字字符串并排序至文件

重点:

由于有排序,考虑使用TreeSet,但是注意重复字符串的处理!

以下是课上的代码,并没有考虑到这个点!

/*
 * 需求:
    从键盘录入5个人的姓名,对其排序后存入文本文件
 */
public class SortNameDemo {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        //创建集合,用于对名字排序
        TreeSet<String> set = new TreeSet<>();
        //遍历输入元素
        for(int i = 1;i<=5;i++){
            System.out.println("输入第 " + i + " 个人的姓名: ");
            set.add(sc.nextLine());
        }
        
        BufferedWriter bw = new BufferedWriter(new FileWriter("name.txt"));
        //遍历集合,将元素存入文件
        for (String name : set) {
            bw.write(name);
            bw.newLine();
        }
        //
        bw.close();
    }
}

 

9.将无序字符排序后保存至文件


10.修改文本文件的内容
重点:
    对同一个文件先开输入流,再开输出流.不要交叉!!!

11.统计各个字符的个数

 

使用IO模拟学生管理系统:
/*
 * 题意:
使用文件保存多个学生信息,在程序中提供查询,添加,删除功能
 */

重点:随时使用流,随时就能写出来!并且准确的判断使用字符流还是字节流方便!

 

public class StudentManageDemo {

    // 将扫描器提升到成员位置
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) throws Exception {
        while (true) {
            System.out.println("1.查询\t2.添加\t3.删除\t4.修改\t5.退出");
            int op = sc.nextInt();
            if (op == 1) {
                search();
            } else if (op == 2) {
                add();
            } else if (op == 3) {
                delete();
            } else if (op == 4) {
                modify();
            } else {
                System.out.println("ByeBye");
                break;
            }
        }
    }

    // 按学号查询
    private static void search() throws Exception {
        //
        System.out.println("输入要查询的学号:");
        String id = sc.next();
        if (check(id)) {
            // 读取文件,将对应学号的信息显示:
            BufferedReader br = new BufferedReader(new FileReader("info.txt"));
            String line = null;
            while ((line = br.readLine()) != null) {
                if (line.startsWith(id)) {
                    String[] split = line.split("_");
                    String num = split[0];
                    String name = split[1];
                    String mark = split[2];
                    System.out.println("学号:\t姓名:\t成绩:");
                    System.out.println(num + "\t" + name + "\t" + mark);
                    break;
                }
            }
            br.close();
        } else {
            System.out.println("此学号不存在!");
        }
    }

    // 删除学生信息
    private static void delete() throws Exception {
        System.out.println("输入要删除的学号:");
        String id = sc.next();
        if (check(id)) {
            BufferedReader br = new BufferedReader(new FileReader("info.txt"));
            ArrayList<String> list = new ArrayList<String>();
            String line = null;
            while ((line = br.readLine()) != null) {
                list.add(line);
            }
            //
            br.close();

            BufferedWriter bw = new BufferedWriter(new FileWriter("info.txt"));
            // 遍历集合,找到指定的学号对应的信息,不写回源文件.其余的都写回源文件
            for (String info : list) {
                if (!info.startsWith(id)) {
                    bw.write(info);
                    bw.newLine();
                }
            }
            bw.close();
            System.out.println("学号 : " + id + " 删除成功");
        } else {
            System.out.println("你输入的学号不存在!!!");
        }
    }

    // 修改指定学号的信息
    private static void modify() throws Exception {
        System.out.println("输入学号:");

        String id = sc.next();
        // 查询此学号是否可用
        if (check(id)) {
            System.out.println("输入新姓名:");
            String name = sc.next();
            System.out.println("输入新成绩:");
            int mark = sc.nextInt();
            // 打开文件,写入新数据
            BufferedReader br = new BufferedReader(new FileReader("info.txt"));
            ArrayList<String> list = new ArrayList<String>();
            String line = null;
            while ((line = br.readLine()) != null) {
                list.add(line);
            }
            //
            br.close();
            // 遍历集合,将指定的学号对应的数据进行修改,再写回
            BufferedWriter bw = new BufferedWriter(new FileWriter("info.txt"));
            for (String info : list) {
                if (info.startsWith(id)) {
                    bw.write(id + "_" + name + "_" + mark);
                    bw.newLine();
                } else {
                    bw.write(info);
                    bw.newLine();
                }
            }
            //
            bw.close();
            System.out.println("修改成功!!!");
        } else {
            System.out.println("学号不存在!");
        }
    }

    private static void add() throws Exception {
        System.out.println("输入学号:");

        String id = sc.next();
        // 查询此学号是否可用
        if (!check(id)) {
            System.out.println("输入姓名:");
            String name = sc.next();
            System.out.println("输入成绩:");
            int mark = sc.nextInt();
            // 打开文件,写入新数据,追加模式!!!
            FileWriter fw = new FileWriter("info.txt", true);
            fw.write(id + "_" + name + "_" + mark);
            fw.write("\r\n");
            fw.close();
        } else {
            System.out.println("学号已经存在!");
        }
    }

    // 查询学号是否可用
    // true : 说明已经存在
    // false : 说明不存在,可用!
    private static boolean check(String id) throws Exception {
        // 读取文件,拿到所有的学号,比对,
        BufferedReader br = new BufferedReader(new FileReader("info.txt"));
        String line = null;
        while ((line = br.readLine()) != null) {
            if (line.split("_")[0].equals(id)) {
                return true;
            }
        }
        br.close();
        return false;
    }
}

 

posted @ 2018-12-01 10:32  杜菲  阅读(178)  评论(0编辑  收藏  举报