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面向对象编程文章查看此处

相关文章
|
20天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
60 3
|
20天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
47 2
|
1天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
1天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
7 2
|
1天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
7 2
|
6天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
23 2
|
12天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
31 2
|
16天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
18天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
39 3
|
18天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
23 2
下一篇
无影云桌面