商品销售记录程序是Java基础阶段非常典型的小项目,核心目标是实现销售数据的录入、存储和输出,能够清晰展示Java程序从接收外部数据到处理再到输出的完整流程。下面我们通过一个完整的示例来拆解实现过程。

程序需求梳理
首先我们明确商品销售记录需要包含的核心信息,每条销售记录应该包含以下字段:
- 商品编号:唯一标识商品的字符串
- 商品名称:描述商品的文本
- 销售数量:正整数类型
- 销售单价:浮点数类型
- 销售时间:记录生成的时间戳
程序需要实现两个核心功能:一是从控制台接收用户输入的上述销售信息,二是将录入的销售记录输出到控制台和本地文件,方便后续查看。
数据输入流程实现
Java中控制台输入通常使用Scanner类实现,我们需要先创建Scanner对象,然后依次提示用户输入各个字段的内容,同时做基础的合法性校验。
输入模块核心代码
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SalesRecordInput {
// 定义销售记录的结构,使用数组存储单条记录的不同字段
public static String[] inputSalesRecord() {
Scanner scanner = new Scanner(System.in);
String[] record = new String[5];
// 输入商品编号
System.out.print("请输入商品编号:");
record[0] = scanner.nextLine();
// 输入商品名称
System.out.print("请输入商品名称:");
record[1] = scanner.nextLine();
// 输入销售数量,做合法性校验
while (true) {
System.out.print("请输入销售数量(正整数):");
try {
int quantity = Integer.parseInt(scanner.nextLine());
if (quantity > 0) {
record[2] = String.valueOf(quantity);
break;
} else {
System.out.println("数量必须为正整数,请重新输入");
}
} catch (NumberFormatException e) {
System.out.println("输入格式错误,请输入整数");
}
}
// 输入销售单价,做合法性校验
while (true) {
System.out.print("请输入销售单价(正数):");
try {
double price = Double.parseDouble(scanner.nextLine());
if (price > 0) {
record[3] = String.valueOf(price);
break;
} else {
System.out.println("单价必须为正数,请重新输入");
}
} catch (NumberFormatException e) {
System.out.println("输入格式错误,请输入数字");
}
}
// 生成销售时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
record[4] = sdf.format(new Date());
return record;
}
}
数据存储与输出流程实现
录入的数据可以先存储在内存集合中,再分别输出到控制台和本地文件。输出到控制台直接使用System.out.println即可,输出到文件需要使用文件输出流。
输出模块核心代码
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SalesRecordOutput {
// 存储所有销售记录的集合
private List<String[]> allRecords = new ArrayList<>();
// 添加单条记录到集合
public void addRecord(String[] record) {
allRecords.add(record);
}
// 输出所有记录到控制台
public void printToConsole() {
System.out.println("n====== 商品销售记录列表 ======");
System.out.println("商品编号 | 商品名称 | 销售数量 | 销售单价 | 销售时间");
for (String[] record : allRecords) {
System.out.println(record[0] + " | " + record[1] + " | " + record[2] + " | " + record[3] + " | " + record[4]);
}
}
// 输出所有记录到本地文件
public void printToFile(String filePath) {
try (FileWriter writer = new FileWriter(filePath, true)) {
writer.write("====== 商品销售记录列表 ======n");
writer.write("商品编号,商品名称,销售数量,销售单价,销售时间n");
for (String[] record : allRecords) {
writer.write(record[0] + "," + record[1] + "," + record[2] + "," + record[3] + "," + record[4] + "n");
}
writer.write("n");
System.out.println("记录已成功写入文件:" + filePath);
} catch (IOException e) {
System.out.println("文件写入失败:" + e.getMessage());
}
}
}
主程序整合演示
我们将输入和输出模块整合到主程序中,实现完整的流程演示,用户可以循环录入多条记录,最后选择输出方式。
主程序代码
import java.util.Scanner;
public class SalesRecordApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
SalesRecordOutput output = new SalesRecordOutput();
while (true) {
System.out.println("n--- 商品销售记录录入 ---");
String[] record = SalesRecordInput.inputSalesRecord();
output.addRecord(record);
System.out.print("是否继续录入记录?(y/n):");
String choice = scanner.nextLine();
if (!"y".equalsIgnoreCase(choice)) {
break;
}
}
// 输出到控制台
output.printToConsole();
// 输出到文件
System.out.print("请输入要保存的文件路径(如:D:/sales.txt):");
String filePath = scanner.nextLine();
output.printToFile(filePath);
scanner.close();
System.out.println("程序执行结束");
}
}
流程总结
整个程序的数据输入输出流程可以总结为三个步骤:第一步通过Scanner类从控制台接收用户输入的原始数据,同时完成格式校验,避免非法数据进入后续流程;第二步将校验通过的单条记录存入内存集合,方便后续统一处理;第三步分别通过控制台输出流和文件输出流,将集合中的记录输出到不同载体,完成数据的持久化或展示。
这个示例涵盖了Java基础开发中常用的输入输出组件,理解这个流程后,可以扩展到图形界面程序或者数据库存储的场景,核心逻辑是相通的。