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

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 协议) 📌 工业控制 & 物联网 📌 航空/铁路票务 📌 政府数据交换


http://www.kler.cn/a/585225.html

相关文章:

  • 计算机网络TCP/IP四层模型
  • 列表动态列处理
  • 链表与栈的实现及操作详解:从基础到应用
  • GIT日常记录
  • 六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))
  • ES怎么通过客户端操作和查询/curl操作指令
  • 地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖
  • 【python实战】-- 选择解压汇总mode进行数据汇总20250314更新
  • 61.Harmonyos NEXT 图片预览组件之数据模型设计与实现
  • API自动化测试实战:Postman + Newman/Pytest的深度解析
  • 注意力机制,层归一化,RBA。KAN-ODE,小波KAN
  • 如何使用Postman,通过Mock的方式测试我们的API
  • 【python】一文掌握 Conda 指令 (anaconda备忘清单)
  • 端口转发、隧道与Pivoting技术详解及区别解析
  • 数据类型及sizeof,进制转换
  • 蓝桥杯 排序题目【算法赛】
  • Unity光线追踪移动端降级适配技术指南
  • Mybatis 框架学习
  • C# Type类中Name、FullName、Namespace、AssemblyQualifiedName的区别
  • 了解一下HTTP的短连接和长连接