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

相关文章
|
10月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
288 0
|
7月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
294 1
|
9月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
10月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
211 3
|
10月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
442 14
|
9月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
604 23
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
239 20
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
507 0
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
316 10

热门文章

最新文章