IO实战篇:数据排序处理深入 | 带你学《Java语言高级特性》之七十六

上一篇:IO实战篇:数据排序处理 | 带你学《Java语言高级特性》之七十五

在上一节中我们实现了简单的输入一些数据并完成数据排序处理的功能,本节将进一步开发,使其实现将数据保存进文件并进行显示的功能。

【本节目标】
通过阅读本节内容,你将继续复习文件IO的相关内容,结合其他相关知识,对数据进行严格的结构化约束输入后实现数据的正确的处理,进而实现将数据保存进文件并能够全部显示的功能。

数据排序处理深入

将上一题的内容进行扩展,可以将全部输入的信息保存在文件中,还可以添加信息,并可以显示全部的数据。

如果此时要进行内容的保存,那么首先一定要确认好所有输入数据的保存位置,所有的数据之间如果要想沿用之前的设计的结构,则数据文件里面的保存应该做到格式统一,即:“姓名:成绩|”的形式进行存储,而在进行数据添加的时候可以添加两类数据:“单独的内容”、“一组内容”。还有一个前提:暂时不去考虑数过大的问题。

1、 设置一个文件的处理类,该类之中只是提供有数据的增加以及读取

public class FileUtil {
    public static String load(File file) {
        Scanner scan = null;
        try{
            scan new Scanner(file);   //进行文件加载
            if(scan.hasNext()) {
                String str = scan.next();  //获取数据
                return str;
            }
            return null;
        }catch(Exception e){
            return null;
        }finally{
            if(scan != null) {
                scan.close();
            }
        }
    }
    public static void boolean append(File file,String content) {
        PrintStream out = null ;
        try{
            out = new PrintStream(new FileOutputStream(file,true));
            out.print(content);  //内容追加
            return true;
        }catch (Exception e){
            return false;
        }finally{
             if(out != null) {
                  out.close();
             }
        }
    }
}

2、 扩充IStudentService操作方法

public interface IStudentService {
    public void append(String str);  //追加数据并且保存到文件
    public Student[] getData();  //获取排序数据
}

3、 修改StudentServiceImpl中的功能

public class StudentServiceImpl implements IStudentService {
    private static final File SAVE_FILE = new File("D:" + File.separator + "student.txt");
    private String content ;
    private Student [] students;
    public StudentServiceImpl() {
        this.content = FileUtil.load(SAVE_FILE);   //读取已有的数据文件
        this.handle();   //进行数据处理
    }
    @Override
    public void append(String str){
        if(str.startwith("|")) {    //最前面有|
            str = str.substring(1);    //截取后面的部分
        }
        if(!str.endwith("|")) {    //数据合理,可以直接追加
            str = str + "|";    //与后面的数据进行分割
        }
        FileUtil.append(SAVE_FILE,str);     //数据的追加处理
    }  
    private void handle(){   //进行字符串数据的处理操作
        if(this.content == null || "".equals(this.content)) {
            return ;  //没有数据可以处理
        }
        String result[] = this.content.split("\\|") ;  //拆分数据
        this.student = new Student[result.length];
        for (int x = 0 ;x < result.length ; x ++) {
            String temp [] = result[x].split(":");
            this.students[x] = new Student(temp[0],Double.parseDouble(temp[1])) ;
        }
    }
    @Override
    public Student[] getData() {
        Arrays.sort(this.students);
        return this.students;
    }
}

4、 此时工厂类不再需要输入数据:

public class Factory{
    private Factory(){}
    public static IStudentService getInstance(){
        return new StudentServiceImpl());
    }
}

5、 定义一个菜单处理

public class Menu {
    public Menu() {
        this.choose();
    }
    public void choose() {
        this.show();
        String choose = InputUtil.getStr("请进行选择");
        switch (choose) {
            case "1":{  //接收输入数据
                String str = InputUtil.getStr("请输入要追加的数据:");
                IStudentService studentService = Factory.getInstance();
                studentService.append(str);  //追加数据
                choose();//重复出现
            }
            case "2":{  //显示数据
                IStudentService studentService = Factory.getInstance();
                System.out.println(Array.toString(studentService.getData()));
                choose();//重复出现
            }
            case "0":{
                System.out.println("下次再见,拜拜!");
                System.exit(1);
            }
            default:{
                System.out.println("您输入了非法的选项,无法进行处理,歉意确认后再次执行程序!");
                choose();
            }
        }
    }
    public void show() {
        System.out.println("【1】追加字符串数据\n");
        System.out.println("【2】显示所有的学生数据\n");
        System.out.println("【0】结束程序执行。");
        System.out.println("\n\n\n");
    }
}

6、 编写测试类

public class IOCaseDemo {
    public static void main(String[] args) {
        new Menu();
    }
}

执行结果:
【1】追加字符串数据

【2】逆序显示所有的字符串数据

【0】结束程序执行。

请进行选择:1
请输入要追加的数据:Tom:78.1
【1】追加字符串数据

【2】逆序显示所有的字符串数据

【0】结束程序执行。

请进行选择1
请输入要追加的数据:Jerry:98.1|tony:99.2
【1】追加字符串数据

【2】逆序显示所有的字符串数据

【0】结束程序执行。

请进行选择:2
[姓名:tony、成绩:99.2,姓名:Jerry、成绩:98.1,姓名:Tom、成绩:78.1]

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:IO实战篇:奇偶数统计 | 带你学《Java语言高级特性》之七十七
更多Java面向对象编程文章查看此处

上一篇:数据湖架构构建与技术解析 | 开发者社区精选文章合集(二十)


下一篇:Java this的使用