You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:09