Mik*_*has 11 java flat-file fixed-length-record fixed-length-file
是否有任何框架/库可以帮助在java中编写固定长度的平面文件?
我想把一个bean /实体的集合写成一个平面文件,而不用担心转换,填充,对齐,填充等等
例如,我想解析一个像:
public class Entity{
String name = "name"; // length = 10; align left; fill with spaces
Integer id = 123; // length = 5; align left; fill with spaces
Integer serial = 321 // length = 5; align to right; fill with '0'
Date register = new Date();// length = 8; convert to yyyyMMdd
}
Run Code Online (Sandbox Code Playgroud)
......进......
name 123 0032120110505
mikhas 5000 0122120110504
superuser 1 0000120101231
Run Code Online (Sandbox Code Playgroud)
...
您不太可能遇到可以应对"Legacy"系统格式的框架.在大多数情况下,Legacy系统不使用标准格式,但框架期望它们.作为传统COBOL系统和Java/Groovy转换的维护者,我经常遇到这种不匹配."担心转换,填充,对齐,填充等问题"主要是您在处理遗留系统时所做的事情.当然,您可以将其中的一部分封装到方便的助手中.但最有可能的是,您需要熟悉java.util.Formatter.
例如,您可以使用Decorator模式创建装饰器来进行转换.下面是一些groovy(很容易转换成Java):
class Entity{
String name = "name"; // length = 10; align left; fill with spaces
Integer id = 123; // length = 5; align left; fill with spaces
Integer serial = 321 // length = 5; align to right; fill with '0'
Date register = new Date();// length = 8; convert to yyyyMMdd
}
class EntityLegacyDecorator {
Entity d
EntityLegacyDecorator(Entity d) { this.d = d }
String asRecord() {
return String.format('%-10s%-5d%05d%tY%<tm%<td',
d.name,d.id,d.serial,d.register)
}
}
def e = new Entity(name: 'name', id: 123, serial: 321, register: new Date('2011/05/06'))
assert new EntityLegacyDecorator(e).asRecord() == 'name 123 0032120110506'
Run Code Online (Sandbox Code Playgroud)
如果您没有太多这些并且对象不太复杂,这是可行的.但很快格式字符串变得无法容忍.然后你可能想要Date的装饰器,比如:
class DateYMD {
Date d
DateYMD(d) { this.d = d }
String toString() { return d.format('yyyyMMdd') }
}
Run Code Online (Sandbox Code Playgroud)
所以你可以用%s格式化:
String asRecord() {
return String.format('%-10s%-5d%05d%s',
d.name,d.id,d.serial,new DateYMD(d.register))
}
Run Code Online (Sandbox Code Playgroud)
但是对于大量的bean属性,字符串仍然太粗,所以你想要的东西能理解你所掌握的COBOL规范的列和长度,所以你会写这样的东西:
class RecordBuilder {
final StringBuilder record
RecordBuilder(recordSize) {
record = new StringBuilder(recordSize)
record.setLength(recordSize)
}
def setField(pos,length,String s) {
record.replace(pos - 1, pos + length, s.padRight(length))
}
def setField(pos,length,Date d) {
setField(pos,length, new DateYMD(d).toString())
}
def setField(pos,length, Integer i, boolean padded) {
if (padded)
setField(pos,length, String.format("%0" + length + "d",i))
else
setField(pos,length, String.format("%-" + length + "d",i))
}
String toString() { record.toString() }
}
class EntityLegacyDecorator {
Entity d
EntityLegacyDecorator(Entity d) { this.d = d }
String asRecord() {
RecordBuilder record = new RecordBuilder(28)
record.setField(1,10,d.name)
record.setField(11,5,d.id,false)
record.setField(16,5,d.serial,true)
record.setField(21,8,d.register)
return record.toString()
}
}
Run Code Online (Sandbox Code Playgroud)
在您编写了足够的setField()方法来处理遗留系统之后,您将简要地考虑将它作为"框架"发布在GitHub上,这样下一个可怜的sap就不必再次使用它了.但是你会考虑所有可见的方法,你看到COBOL存储"日期"(MMDDYY,YYMMDD,YYDDD,YYYYDDD)和数字(假设十进制,显式小数,符号作为尾随单独或符号作为主要浮动字符).然后你会意识到为什么没有人为此制作一个好的框架,偶尔会将你的生产代码的一些部分发布到SO中作为一个例子......;)
| 归档时间: |
|
| 查看次数: |
31600 次 |
| 最近记录: |