如何创建支持在固定偏移位置插入值的字符串
固定偏移定长字符串填充实现方案
直接给结论:这种场景不需要引入任何第三方依赖,原生能力完全可以覆盖,不建议引入codehaus下的非官方维护组件,这类老旧包很多已经停止维护,容易引入兼容和安全问题。
首选方案:预填充字符数组实现(零依赖、性能最优、边界可控)
这是最稳妥的实现方式,逻辑非常直接:
- 先根据字段总长度初始化字符数组,所有位置预填充空格(或你需要的占位符)
- 对每个待填充字段,从指定的起始偏移位置开始,把字段值拷贝到数组对应位置,拷贝时做好边界判断:值长度超出预留长度就截断,长度不足则保留后续位置的占位符即可。
可直接复用的实现代码:
import java.util.Arrays // 配置项:字段起始偏移和对应值 def fields = [ 0: "1", 10: "Chris", 20: "Smith", 30: "Paris" ] // 配置项:字符串总长度,按最后一个字段的偏移+预留长度设置 int totalLength = 40 // 初始化全空格缓冲区 char[] buf = new char[totalLength] Arrays.fill(buf, ' ' as char) fields.each { offset, value -> String val = value?.toString() ?: "" // 计算可拷贝长度,避免数组越界 int copyLength = Math.min(val.length(), totalLength - offset) // 写入对应位置 val.getChars(0, copyLength, buf, offset) } String fixedLenStr = new String(buf)
运行后输出的结果就和你给出的示例效果完全一致,如果你需要用0或者其他字符填充,只需要修改Arrays.fill里传入的字符即可。
适配Groovy原生putAt(IntRange)的写法
你之前查到的StringBuffer.putAt需要传区间参数,完全可以直接用,只需要根据字段的起始偏移和预留长度自己构造左闭右开的区间就行,不需要额外找只传起始位置的方法:
// 预填40个空格作为基础缓冲区 StringBuffer sb = new StringBuffer(" " * 40) // 每个字段按 [起始偏移..<下一个字段偏移] 构造Range,值用padRight补空格到对应长度 sb.putAt(0..<10, "1".padRight(10, ' ')) sb.putAt(10..<20, "Chris".padRight(10, ' ')) sb.putAt(20..<30, "Smith".padRight(10, ' ')) sb.putAt(30..<40, "Paris".padRight(10, ' ')) String result = sb.toString()
这种写法更符合Groovy的编码风格,注意必须给每个值补空格到和区间长度一致,否则会出现后续字段被挤错位的问题。
不推荐使用第三方包的原因:codehaus旗下的大部分组件是早年的第三方开源项目,不属于官方维护的核心依赖,很多项目已经停更十年以上,生产环境引入会带来不必要的版本兼容、安全漏洞风险,这类简单的字符串处理场景完全没有必要引入外部依赖。
内容的提问来源于stack exchange,提问作者ChrisMS
相关产品推荐
相关产品推荐

