当前位置: 首页 > news >正文

Java 实现定长报文模拟器(支持配置文件 默认值)

金融、证券、工业控制等场景,经常使用定长报文(Fixed-Length Message)来保证高效、稳定的数据传输。本文介绍如何用 Java 读取配置文件根据字段偏移量生成定长报文,并支持默认值与自动填充

1. 需求分析

目标

  1. 支持字段偏移量配置(从 resources/packet_simulate.txt 读取)。

  2. 支持默认值,如未提供,则自动填充随机值。

  3. 超长截断,不足补空格,确保格式对齐。

  4. 生成完整的定长报文

配置文件格式 (packet_simulate.txt

每行定义一个字段:

字段索引\t字段名称\t起始位置\t长度\t默认值(可选)

示例:

1\t交易码\t0\t6\tTRADE
2\t银行卡号\t6\t16\t6225881234567890
3\t交易金额\t22\t10\t10000
4\t交易日期\t32\t8\t20240314
5\t授权码\t40\t6\t

授权码 未提供默认值,将自动生成随机值。\t 表示制表符,比如从excel编辑数据后粘贴到txt文件会带有制表符

2. 代码实现

2.1 解析配置文件

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

public class FixedLengthMessageSimulator {
    private static final String CONFIG_PATH = "resources/packet_simulate.txt";
    private static final Random RANDOM = new Random();

    public static List<FieldDefinition> loadFieldDefinitions() throws IOException {
        List<FieldDefinition> fields = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(CONFIG_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split("\\t");
                if (parts.length < 4) continue;
                
                int index = Integer.parseInt(parts[0]);
                String fieldName = parts[1];
                int start = Integer.parseInt(parts[2]);
                int length = Integer.parseInt(parts[3]);
                String defaultValue = (parts.length > 4) ? parts[4] : "";
                
                fields.add(new FieldDefinition(index, fieldName, start, length, defaultValue));
            }
        }
        return fields;
    }
}

2.2 生成定长报文

public static String generateMessage(List<FieldDefinition> fields) {
    int totalLength = fields.get(fields.size() - 1).startPosition + fields.get(fields.size() - 1).length;
    byte[] message = new byte[totalLength];
    
    for (FieldDefinition field : fields) {
        int start = field.startPosition;
        int length = field.length;
        String value = field.defaultValue.isEmpty() ? generateRandomString(length) : field.defaultValue;
        
        value = fixLength(value, length);
        System.arraycopy(value.getBytes(StandardCharsets.UTF_8), 0, message, start, length);
    }
    
    return new String(message, StandardCharsets.UTF_8);
}

2.3 处理超长 & 填充空格

private static String generateRandomString(int length) {
    String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
        sb.append(chars.charAt(RANDOM.nextInt(chars.length())));
    }
    return fixLength(sb.toString(), length);
}

private static String fixLength(String value, int length) {
    return value.length() > length ? value.substring(0, length) : String.format("%-" + length + "s", value);
}

2.4 运行程序

public static void main(String[] args) {
    try {
        List<FieldDefinition> fields = loadFieldDefinitions();
        String message = generateMessage(fields);
        System.out.println("生成的报文: [" + message + "]");
    } catch (IOException e) {
        System.err.println("读取配置文件失败: " + e.getMessage());
    }
}

3. 示例输出

生成的报文: [TRADE622588123456789010000    20240314V5X9Z2]
  • TRADE (6位)

  • 6225881234567890 (16位)

  • 10000  (10位,补空格)

  • 20240314 (8位)

  • V5X9Z2 (6位,自动填充随机值)

4. 代码特点 & 优势

✅ 支持配置文件,按字段顺序、名称、偏移量、长度、默认值读取。 ✅ 支持默认值,如未提供则自动生成随机字符串。 ✅ 超长截断 & 不足补空格,确保格式符合规范。 ✅ 解析 & 生成高效,适用于大批量报文生成。 ✅ 可扩展,可支持 JSON 配置、变长字段等。

5. 适用场景

📌 银行清算报文(ISO 8583、SWIFT) 📌 证券交易(FIX 协议) 📌 工业控制 & 物联网 📌 航空/铁路票务 📌 政府数据交换

相关文章:

  • OpenCV特征提取与深度学习CNN特征提取差异
  • CSS 实现 文本垂直居中
  • Qt for Android(b站讯为QT教程)
  • C语言内容
  • STM32G030x6/x8开发指南
  • 使用multiprocessing实现进程间共享内存
  • YOLOv11 目标检测
  • 物联网(IoT)架构中,平台层的应用与技术
  • 海量数据查询加速:Presto、Trino、Apache Arrow
  • 神经网络量化-基础算法介绍
  • Sidekick:你的 macOS 本地 AI 助手,畅享智能对话!
  • Kafka消息队列
  • 分享一个工具可以国内无限制访问GitHub(来源于GitHub开源项目)
  • 【3-14 STC-pair超级详细的解说】
  • linux(ubuntu)中Conda、CUDA安装Xinference报错ERROR: Failed to build (llama-cpp-python)
  • openharmony5.0中HDF驱动框架源码梳理-服务管理接口
  • Deny by project hooks setting ‘default‘: size of the file
  • Android自动化测试工具
  • tcpdump剖析:入门网络流量分析实战指南
  • 《Operating System Concepts》阅读笔记:p286-p308
  • 中国—美国经贸合作对接交流会在华盛顿成功举行
  • 男子入户强奸高龄独居妇女致其死亡,法院:属实,已执行死刑
  • 沙青青评《通勤梦魇》︱“人机组合”的通勤之路
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 睡觉总做梦是睡眠质量差?梦到这些事,才要小心
  • 普京提议无条件重启俄乌谈判,外交部:我们支持一切致力于和平的努力