构建一个小型 Java 应用:从命令行到图形界面,全面实现!

举报
喵手 发表于 2025/06/09 17:44:15 2025/06/09
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

构建一个小型 Java 应用:从命令行到图形界面,全面实现

  在 Java 开发中,构建一个完整的应用涉及到多个技术栈的使用,包括命令行界面(CLI)或图形用户界面(GUI)开发、数据存储与文件操作、异常处理和多线程编程等。通过构建一个小型的 Java 应用,我们可以全面了解如何结合这些技术来实现一个功能完备的应用。

在本教程中,我们将逐步构建一个小型的 Java 应用,涵盖以下方面:

  1. 使用 Java SE 技术栈构建完整的应用:我们会选择一个简单的命令行应用来实现。
  2. 数据存储与文件操作的实现:应用会涉及将数据存储到文件,并从文件中读取数据。
  3. 异常处理:确保应用在运行过程中能够正确处理错误和异常。
  4. 多线程应用:我们将引入多线程来处理后台任务。

一、构建命令行应用

假设我们要构建一个简单的 任务管理系统,该系统允许用户添加任务、查看任务列表,并将任务保存到文件中。任务包含以下字段:ID名称描述

1.1 任务类(Task)

首先,定义一个任务类 Task,它包含 ID名称描述

public class Task {
    private int id;
    private String name;
    private String description;

    public Task(int id, String name, String description) {
        this.id = id;
        this.name = name;
        this.description = description;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

1.2 任务管理类(TaskManager)

TaskManager 类负责管理任务的添加、查看和保存任务。我们将任务存储在一个 List 中,并通过文件操作将任务保存到文件中。

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TaskManager {
    private List<Task> tasks;
    private static final String FILE_NAME = "tasks.txt";

    public TaskManager() {
        tasks = new ArrayList<>();
        loadTasks();
    }

    public void addTask(String name, String description) {
        int id = tasks.size() + 1;
        Task task = new Task(id, name, description);
        tasks.add(task);
        saveTasks();
    }

    public void showTasks() {
        if (tasks.isEmpty()) {
            System.out.println("No tasks found.");
        } else {
            for (Task task : tasks) {
                System.out.println(task);
            }
        }
    }

    private void loadTasks() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {
            tasks = (List<Task>) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("No previous tasks found or error loading tasks.");
        }
    }

    private void saveTasks() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {
            oos.writeObject(tasks);
        } catch (IOException e) {
            System.out.println("Error saving tasks.");
        }
    }
}

1.3 主程序类(Main)

主程序类负责与用户交互,处理用户输入,展示任务列表,并调用 TaskManager 来管理任务。

import java.util.Scanner;

public class TaskApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        TaskManager taskManager = new TaskManager();

        while (true) {
            System.out.println("\nTask Manager");
            System.out.println("1. Add Task");
            System.out.println("2. Show Tasks");
            System.out.println("3. Exit");
            System.out.print("Select an option: ");

            int option = scanner.nextInt();
            scanner.nextLine();  // Consume the newline character

            switch (option) {
                case 1:
                    System.out.print("Enter task name: ");
                    String name = scanner.nextLine();
                    System.out.print("Enter task description: ");
                    String description = scanner.nextLine();
                    taskManager.addTask(name, description);
                    break;
                case 2:
                    taskManager.showTasks();
                    break;
                case 3:
                    System.out.println("Exiting...");
                    return;
                default:
                    System.out.println("Invalid option. Please try again.");
            }
        }
    }
}

二、数据存储与文件操作的实现

在上面的应用中,我们使用了文件操作将任务保存到文件,并从文件加载任务。这是通过 ObjectInputStreamObjectOutputStream 完成的,这两者支持将 Java 对象序列化和反序列化。通过这种方式,我们可以将任务列表持久化存储到 tasks.txt 文件中,应用关闭后仍然能够读取和保存任务数据。

2.1 异常处理

我们在文件操作中添加了异常处理,以防止因文件不存在或读取/写入错误导致程序崩溃。例如,当文件无法读取时,程序会显示错误消息,并继续运行。

2.2 错误处理

TaskManager 类在加载任务时会捕获 IOExceptionClassNotFoundException,并提供友好的错误提示。

三、异常处理与多线程应用

3.1 异常处理

Java 中的异常处理是通过 try-catch 语句来捕获和处理运行时可能发生的错误。在上述代码中,IOExceptionClassNotFoundException 是在文件操作时可能抛出的异常,程序通过 catch 块处理它们并输出相应的错误信息。

代码示例:简单的异常处理
try {
    // Potential code that may throw exceptions
} catch (IOException e) {
    System.out.println("An error occurred while reading/writing file: " + e.getMessage());
} catch (Exception e) {
    System.out.println("Unexpected error: " + e.getMessage());
}

3.2 多线程应用

假设我们希望在后台定期保存任务(例如每分钟一次),而不阻塞主线程的运行。我们可以使用多线程来实现这个功能。我们将创建一个后台线程,定期调用 saveTasks 方法保存任务。

代码示例:多线程保存任务
public class TaskSaverThread extends Thread {
    private TaskManager taskManager;

    public TaskSaverThread(TaskManager taskManager) {
        this.taskManager = taskManager;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(60000);  // 每隔 60 秒保存任务
                taskManager.saveTasks();
                System.out.println("Tasks saved in background.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

TaskApp 中,我们创建并启动这个线程:

public class TaskApp {
    public static void main(String[] args) {
        TaskManager taskManager = new TaskManager();
        TaskSaverThread taskSaverThread = new TaskSaverThread(taskManager);
        taskSaverThread.start();  // 启动任务保存线程

        // 继续执行主线程任务(例如用户交互)
        // 参考之前的代码
    }
}

  通过这种方式,任务保存操作不会影响用户的其他操作,而是在后台定期自动完成。


总结:小型 Java 应用的构建与技术栈

在本教程中,我们构建了一个简单的命令行应用,涉及了以下技术栈:

  1. 任务管理系统:使用 Java SE 技术栈构建了一个命令行应用。
  2. 数据存储与文件操作:通过 ObjectInputStreamObjectOutputStream 实现了将任务保存到文件中,并从文件读取任务。
  3. 异常处理:确保程序在文件操作出错时能够优雅地处理异常。
  4. 多线程应用:通过创建后台线程定期保存任务,提升了应用的响应性。

通过这种实践,大家可以全面了解如何构建一个小型的 Java 应用,并掌握如何在实际开发中使用文件操作、异常处理以及多线程等技术。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。