构建一个小型 Java 应用:从命令行到图形界面,全面实现!
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
构建一个小型 Java 应用:从命令行到图形界面,全面实现
在 Java 开发中,构建一个完整的应用涉及到多个技术栈的使用,包括命令行界面(CLI)或图形用户界面(GUI)开发、数据存储与文件操作、异常处理和多线程编程等。通过构建一个小型的 Java 应用,我们可以全面了解如何结合这些技术来实现一个功能完备的应用。
在本教程中,我们将逐步构建一个小型的 Java 应用,涵盖以下方面:
- 使用 Java SE 技术栈构建完整的应用:我们会选择一个简单的命令行应用来实现。
- 数据存储与文件操作的实现:应用会涉及将数据存储到文件,并从文件中读取数据。
- 异常处理:确保应用在运行过程中能够正确处理错误和异常。
- 多线程应用:我们将引入多线程来处理后台任务。
一、构建命令行应用
假设我们要构建一个简单的 任务管理系统,该系统允许用户添加任务、查看任务列表,并将任务保存到文件中。任务包含以下字段: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.");
}
}
}
}
二、数据存储与文件操作的实现
在上面的应用中,我们使用了文件操作将任务保存到文件,并从文件加载任务。这是通过 ObjectInputStream
和 ObjectOutputStream
完成的,这两者支持将 Java 对象序列化和反序列化。通过这种方式,我们可以将任务列表持久化存储到 tasks.txt
文件中,应用关闭后仍然能够读取和保存任务数据。
2.1 异常处理
我们在文件操作中添加了异常处理,以防止因文件不存在或读取/写入错误导致程序崩溃。例如,当文件无法读取时,程序会显示错误消息,并继续运行。
2.2 错误处理
TaskManager
类在加载任务时会捕获 IOException
和 ClassNotFoundException
,并提供友好的错误提示。
三、异常处理与多线程应用
3.1 异常处理
Java 中的异常处理是通过 try-catch
语句来捕获和处理运行时可能发生的错误。在上述代码中,IOException
和 ClassNotFoundException
是在文件操作时可能抛出的异常,程序通过 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 应用的构建与技术栈
在本教程中,我们构建了一个简单的命令行应用,涉及了以下技术栈:
- 任务管理系统:使用 Java SE 技术栈构建了一个命令行应用。
- 数据存储与文件操作:通过
ObjectInputStream
和ObjectOutputStream
实现了将任务保存到文件中,并从文件读取任务。 - 异常处理:确保程序在文件操作出错时能够优雅地处理异常。
- 多线程应用:通过创建后台线程定期保存任务,提升了应用的响应性。
通过这种实践,大家可以全面了解如何构建一个小型的 Java 应用,并掌握如何在实际开发中使用文件操作、异常处理以及多线程等技术。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)