Java实现文本文件写入代码的咨询(含现有业务代码)
问题描述
我是Java新手,目前已有一套借助第三方帮助搭建的业务代码,包含客户注册、预订创建等功能。希望在完成新客户注册或新预订创建后,将对应的客户或预订信息写入文本文件,现有核心代码如下:
public static void main(String[] args) { // setup and initialise the test data List<Flight> availableFlights = generateTestFlights(); List<Hotel> availableHotels = generateTestHotels(); List<Excursion> availableExcursions = generateTestExcursions(); // create a new list of bookings List<Booking> listOfReservedBookings = new ArrayList<>(); // initialise a new sales consultant which will operate on the behalf of the // customer SalesConsultant salesConsultant = new SalesConsultant(); // initialise the keyboard code Scanner scanner = new Scanner(System.in); // what will be displayed when executing application System.out.println("Menu: "); System.out.println("1) Register a new Customer"); System.out.println("2) Create a new Booking"); System.out.println("3) View available list of Flights"); System.out.println("4) View available list of Hotels"); System.out.println("5) View available list of Excursions"); System.out.println("6) View Reserved Bookings"); System.out.println("Please make your choice (type code number): "); // displaying above written within brackets String choice = scanner.nextLine(); // when "exit" choice is not showing while (choice.equalsIgnoreCase("exit") == false) { // register customer if (choice.equalsIgnoreCase("1")) { System.out.println("Registering a new customer: "); // get the card ID for the new customer System.out.println("Please insert Customer ID Card Number: "); String cardID = scanner.nextLine(); // get the name of the new customer System.out.println("Please insert Customer Name & Surname: "); String name = scanner.nextLine(); // get the address of the new customer System.out.println("Please insert Customer Address: "); String address = scanner.nextLine(); // register customer Customer customer = new Customer(); salesConsultant.registerCustomer(customer); System.out.println("Customer has been registered successfully!"); } // 此处省略其他菜单选项代码 } }
想咨询该功能的具体实现方法,是否需要创建新类,还是可直接在main方法中完成?
解决方案
作为Java新手,我强烈建议你不要直接在main方法里写文件写入逻辑——main方法本质是程序的入口,把业务逻辑(比如注册客户)和持久化逻辑(写入文件)混在一起,会让代码变得臃肿混乱,后续修改存储方式(比如改成数据库)或者复用写入逻辑时,会非常麻烦。
正确的做法是创建一个专门负责数据持久化的类,把文件写入逻辑封装进去,这符合面向对象的「单一职责原则」,代码也会更清晰易维护。下面是具体实现步骤:
步骤1:创建数据持久化服务类
我们可以创建一个DataFileWriter类,专门处理客户和预订信息的文件写入操作。这里用基础的文本格式存储,你也可以根据需求改成CSV、JSON等更规范的格式(方便后续读取解析):
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class DataFileWriter { // 定义存储文件的路径,可根据自己的需求修改 private static final String CUSTOMER_FILE = "customers.txt"; private static final String BOOKING_FILE = "bookings.txt"; // 写入客户信息到文件 public void writeCustomerToFile(Customer customer) { // 使用try-with-resources自动关闭流,避免资源泄漏 try (BufferedWriter writer = new BufferedWriter(new FileWriter(CUSTOMER_FILE, true))) { // 按「ID|姓名|地址」的格式拼接一行文本,可根据Customer类属性调整 String customerLine = String.format("%s|%s|%s", customer.getCardID(), customer.getName(), customer.getAddress()); writer.write(customerLine); writer.newLine(); // 换行保存每条记录 System.out.println("客户信息已成功写入文件!"); } catch (IOException e) { // 捕获IO异常,打印错误信息(新手阶段可这样处理,后续可优化为日志或友好提示) System.err.println("写入客户信息失败:" + e.getMessage()); } } // 写入预订信息到文件 public void writeBookingToFile(Booking booking) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(BOOKING_FILE, true))) { // 按「预订ID|客户ID|航班号」的格式拼接,可根据Booking类属性调整 String bookingLine = String.format("%s|%s|%s", booking.getBookingId(), booking.getCustomer().getCardID(), booking.getFlight().getFlightNumber()); writer.write(bookingLine); writer.newLine(); System.out.println("预订信息已成功写入文件!"); } catch (IOException e) { System.err.println("写入预订信息失败:" + e.getMessage()); } } }
步骤2:在main方法中调用持久化类
首先在main方法里初始化DataFileWriter实例,然后在客户注册成功、预订创建成功的节点调用对应的写入方法。另外注意:你原来的注册代码里没有给Customer对象赋值属性,这会导致写入空数据,需要先把用户输入的信息绑定到对象上!
修改后的核心代码片段:
public static void main(String[] args) { // ... 原有初始化代码 ... // 初始化数据文件写入器 DataFileWriter fileWriter = new DataFileWriter(); // ... 菜单显示代码 ... while (choice.equalsIgnoreCase("exit") == false) { if (choice.equalsIgnoreCase("1")) { // ... 获取用户输入的cardID、name、address代码 ... // 修复:给Customer对象设置属性 Customer customer = new Customer(); customer.setCardID(cardID); customer.setName(name); customer.setAddress(address); salesConsultant.registerCustomer(customer); System.out.println("Customer has been registered successfully!"); // 调用写入方法,保存客户信息 fileWriter.writeCustomerToFile(customer); } // 处理创建预订的逻辑 else if (choice.equalsIgnoreCase("2")) { // 此处编写创建预订的业务逻辑,假设已生成完整的Booking对象 Booking newBooking = // ... 你的预订创建代码 ... listOfReservedBookings.add(newBooking); System.out.println("预订创建成功!"); // 写入预订信息到文件 fileWriter.writeBookingToFile(newBooking); } // ... 其他菜单选项代码 ... // 循环末尾重新获取用户选择,避免死循环 System.out.println("\n请再次选择操作(输入exit退出):"); choice = scanner.nextLine(); } }
额外建议
- 异常处理优化:上面的代码只是简单打印错误,实际项目中可以用日志框架记录错误,或者给用户更友好的提示。
- 文件追加模式:
FileWriter的第二个参数true表示追加写入,新记录会加到文件末尾,不会覆盖原有内容。 - 数据格式选择:如果以后需要读取文件数据,建议用CSV或JSON格式,比自定义的
|分隔更规范,也方便用工具类解析。 - 类的封装性:确保
Customer和Booking类有对应的getter方法,这样DataFileWriter才能获取到属性值。
内容的提问来源于stack exchange,提问作者Avner Fenech
相关产品推荐
相关产品推荐

