时间:2021-07-01 10:21:17 帮助过:5人阅读
public class FoxproDBase3Reader extends DbfReader { protected void readFields() throws IOException { fields = new ArrayList<Field>(); for (int i = 0; i < (header.getHeaderLength() - 32 - 1) / 32; i++) { fields.add(readField()); } } public byte getType() { return 3; } protected Field readField() throws IOException { Field field = new Field(); ByteBuffer byteBuffer = ByteBuffer.allocate(32); readByteBuffer(byteBuffer); byte[] bytes = byteBuffer.array(); field.setName(new String(bytes, 0, 11, encode).trim().split("\0")[0]); field.setType((char) bytes[11]); field.setDisplacement(Util.getUnsignedInt(bytes, 12, 4)); field.setLength(Util.getUnsignedInt(bytes, 16, 1)); field.setDecimal(Util.getUnsignedInt(bytes, 17, 1)); field.setFlag(bytes[18]); return field; } protected void readHeader() throws IOException { header = new Header(); ByteBuffer byteBuffer = ByteBuffer.allocate(31); readByteBuffer(byteBuffer); byte[] bytes = byteBuffer.array(); header.setLastUpdate((Util.getUnsignedInt(bytes, 0, 1) + 1900) * 10000 + Util.getUnsignedInt(bytes, 1, 1) * 100 + Util.getUnsignedInt(bytes, 2, 1)); header.setRecordCount(Util.getUnsignedInt(bytes, 3, 4)); header.setHeaderLength(Util.getUnsignedInt(bytes, 7, 2)); header.setRecordLength(Util.getUnsignedInt(bytes, 9, 2)); } }
public class DbfReaderTest { static String[] files = {"BESTIMATE20140401", "BHDQUOTE20140401"}; public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException { for (String file : files) { printFile(file); } } public static void printFile(String fileName) throws IOException, InstantiationException, IllegalAccessException { Reader dbfReader = DbfReader.parse("E:\\20140401\\" + fileName + ".DBF"); for (Field field : dbfReader.getFields()) { System.out.printf("name:%s %s(%d,%d)\n", field.getName(), field.getType(), field.getLength(), field.getDecimal()); } System.out.println(); for (int i = 0; i < dbfReader.getHeader().getRecordCount(); i++) { dbfReader.next(); for (Field field : dbfReader.getFields()) { System.out.printf("%" + field.getLength() + "s", field.getStringValue()); } System.out.println(); } dbfReader.close(); } }
085959_EzQV_1245989.jpg (15.06 KB, 下载次数: 0)
下载附件
总共的代码行数是282行,去掉import和接口声明之类的,真正干活的代码大概就200行了:
总结 上面不仅展示了如何实现DBF文件的解析,同时还展示了如何在现在面临的需求与未来的扩展进行合理均衡的设计方式。
比如:要实现另外一个标准的DBF文件支持,只要类似上面FoxproDBase3Reader类一样,简单实现之后,再调用DbfParser.addReader(xxxReader);
好的设计需要即避免过度设计,搞得太复杂,同时也要对未来的变化与扩展做适当考虑,避免新的需求来的时候需要这里动动,那里改改导致结构上的调整与变化,同时要注意遵守DRY原则,可以这样说如果程序中有必要的大量的重复,就说明一定存在结构设计上的问题。
欢迎关注:http://web.j2ee.top。本例涉及的代码和框架资料,将会在这里分享。也欢迎进加入QQ群:228977971,让我们一起成长!
《自己动手写框架2》:用200行的DBF解析器来展示良好架构设计
标签: