Java小项目水果管理系统怎么做?从零开始构建完整功能的入门实践
在学习Java编程语言的过程中,很多初学者都会遇到一个共性问题:如何将理论知识转化为实际项目?一个简单但实用的小项目往往能带来极大的成就感和成长。今天我们就以水果管理系统为例,详细介绍如何用Java开发一个具备基础增删改查(CRUD)功能的桌面应用系统,帮助你掌握面向对象设计、文件读写、用户交互等核心技能。
一、项目背景与目标
随着信息化时代的到来,传统手工记录水果库存的方式已经难以满足日常管理需求。开发一个轻量级的水果管理系统,可以帮助小型水果店或校园社团实现对水果种类、数量、价格等信息的有效管理。本项目适合Java初学者作为实战练习,既能巩固语法基础,又能锻炼逻辑思维和工程化能力。
我们设定的目标如下:
- 支持添加、删除、修改、查询水果信息
- 数据持久化存储到本地文件(如CSV或文本文件)
- 提供简洁易用的命令行界面(CLI)
- 具备基本的数据校验机制(如防止重复添加、输入合法性检查)
- 代码结构清晰,便于后续扩展为图形界面版本
二、技术选型与环境准备
本项目使用纯Java标准库完成,无需额外框架依赖,适合初学者上手:
- 开发工具: IntelliJ IDEA 或 Eclipse(推荐IDEA,社区版免费)
- Java版本: JDK 8 或更高版本(建议JDK 11以上,稳定性更好)
- 运行平台: Windows / macOS / Linux 均可
- 文件格式: 使用纯文本文件(.txt)或CSV格式保存数据,便于调试和理解
三、项目结构设计
为了保证代码的可维护性和可读性,我们将项目划分为以下几个模块:
1. 实体类 Fruit.java
public class Fruit {
private String name;
private double price;
private int quantity;
public Fruit(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
// Getter and Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
public int getQuantity() { return quantity; }
public void setQuantity(int quantity) { this.quantity = quantity; }
@Override
public String toString() {
return String.format("%s - ¥%.2f - %d个", name, price, quantity);
}
}
2. 数据访问层:FruitDAO.java
负责读取和写入文件中的水果数据。这里我们采用简单的文本文件存储方式,每行一条记录,格式为:名称,单价,数量。
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class FruitDAO {
private static final String FILE_PATH = "fruits.txt";
public List<Fruit> loadFruits() {
List<Fruit> fruits = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) {
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 3) {
String name = parts[0];
double price = Double.parseDouble(parts[1]);
int quantity = Integer.parseInt(parts[2]);
fruits.add(new Fruit(name, price, quantity));
}
}
} catch (IOException e) {
System.out.println("加载数据失败:" + e.getMessage());
}
return fruits;
}
public void saveFruits(List<Fruit> fruits) {
try (PrintWriter pw = new PrintWriter(new FileWriter(FILE_PATH))) {
for (Fruit f : fruits) {
pw.println(f.getName() + "," + f.getPrice() + "," + f.getQuantity());
}
} catch (IOException e) {
System.out.println("保存数据失败:" + e.getMessage());
}
}
}
3. 控制器层:FruitManager.java
这是整个系统的“大脑”,负责处理用户的操作请求,并调用DAO进行数据操作。
import java.util.Scanner;
import java.util.List;
public class FruitManager {
private List<Fruit> fruits;
private FruitDAO dao;
private Scanner scanner;
public FruitManager() {
this.dao = new FruitDAO();
this.fruits = dao.loadFruits();
this.scanner = new Scanner(System.in);
}
public void start() {
while (true) {
showMenu();
int choice = getIntInput("请选择操作:");
switch (choice) {
case 1:
addFruit();
break;
case 2:
removeFruit();
break;
case 3:
updateFruit();
break;
case 4:
searchFruit();
break;
case 5:
listAllFruits();
break;
case 6:
saveAndExit();
return;
default:
System.out.println("无效选项,请重新选择。");
}
}
}
private void showMenu() {
System.out.println("\n========== 水果管理系统 ==========");
System.out.println("1. 添加水果");
System.out.println("2. 删除水果");
System.out.println("3. 修改水果信息");
System.out.println("4. 查询水果");
System.out.println("5. 显示所有水果");
System.out.println("6. 退出并保存");
}
private void addFruit() {
System.out.print("请输入水果名称:");
String name = scanner.nextLine();
if (findFruitByName(name) != null) {
System.out.println("该水果已存在!");
return;
}
double price = getDoubleInput("请输入单价:");
int quantity = getIntInput("请输入数量:");
fruits.add(new Fruit(name, price, quantity));
System.out.println("添加成功!");
}
private void removeFruit() {
System.out.print("请输入要删除的水果名称:");
String name = scanner.nextLine();
Fruit fruit = findFruitByName(name);
if (fruit != null) {
fruits.remove(fruit);
System.out.println("删除成功!");
} else {
System.out.println("未找到该水果。");
}
}
private void updateFruit() {
System.out.print("请输入要修改的水果名称:");
String name = scanner.nextLine();
Fruit fruit = findFruitByName(name);
if (fruit != null) {
double newPrice = getDoubleInput("请输入新单价:");
int newQuantity = getIntInput("请输入新数量:");
fruit.setPrice(newPrice);
fruit.setQuantity(newQuantity);
System.out.println("更新成功!");
} else {
System.out.println("未找到该水果。");
}
}
private void searchFruit() {
System.out.print("请输入要查询的水果名称:");
String name = scanner.nextLine();
Fruit fruit = findFruitByName(name);
if (fruit != null) {
System.out.println("找到:" + fruit.toString());
} else {
System.out.println("未找到该水果。");
}
}
private void listAllFruits() {
if (fruits.isEmpty()) {
System.out.println("暂无水果信息。");
return;
}
System.out.println("当前水果列表:");
for (Fruit f : fruits) {
System.out.println(f.toString());
}
}
private void saveAndExit() {
dao.saveFruits(fruits);
System.out.println("数据已保存,程序退出。");
}
private Fruit findFruitByName(String name) {
return fruits.stream()
.filter(f -> f.getName().equals(name))
.findFirst()
.orElse(null);
}
private int getIntInput(String prompt) {
while (true) {
try {
System.out.print(prompt);
return Integer.parseInt(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("请输入有效数字。");
}
}
}
private double getDoubleInput(String prompt) {
while (true) {
try {
System.out.print(prompt);
return Double.parseDouble(scanner.nextLine());
} catch (NumberFormatException e) {
System.out.println("请输入有效数字。");
}
}
}
}
四、主类启动入口 Main.java
public class Main {
public static void main(String[] args) {
FruitManager manager = new FruitManager();
manager.start();
}
}
五、运行效果演示
编译并运行后,控制台会显示菜单,用户可以按提示操作:
- 添加水果(如苹果、香蕉)
- 查询某个水果是否存在及其详情
- 修改某水果的价格或库存
- 删除不需要的水果条目
- 退出时自动保存至fruits.txt文件
六、常见问题与优化建议
1. 如何避免重复添加水果?
我们在addFruit()中加入了查找逻辑,如果发现同名水果则提示“已存在”,这是最直接有效的防重策略。
2. 文件路径如何设置更灵活?
目前固定为fruits.txt,建议改为配置项,比如通过参数传入文件路径,或使用Properties文件管理路径。
3. 如何扩展成GUI版本?
未来可以引入Swing或JavaFX,将命令行界面转换为图形界面,增加按钮、表格展示等功能,提升用户体验。
4. 数据安全性考虑
当前版本仅做简单校验,生产环境中应加入异常捕获、日志记录、权限验证等机制。
七、总结与学习价值
这个Java小项目水果管理系统虽然功能简单,却是学习Java编程的良好起点。它涵盖了以下关键知识点:
- 面向对象编程思想(封装、继承、多态)
- 集合类的使用(List、Stream API)
- 文件IO操作(读写文本文件)
- 用户输入处理与异常处理
- 模块化设计与职责分离(DAO层、业务逻辑层)
对于初学者来说,这是一个完整的开发闭环:从需求分析 → 设计类结构 → 编码实现 → 测试运行 → 优化改进。通过这样的项目实践,不仅能增强动手能力,还能建立起对软件工程流程的理解。
如果你正在学习Java,不妨尝试自己动手敲一遍代码,再根据自己的想法进行扩展,比如加入排序功能、导出Excel报表、支持模糊搜索等,让这个小项目变成你的第一个真正意义上的“作品”。

