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

相关文章
|
1月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
155 1
|
2月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
185 3
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
203 16
|
3月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
3月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
3月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
3月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
4月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
103 2
|
4月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
137 0
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
127 1