EasyDBF Java读写DBF工具类(支持:深交所D-COM、上交所PROP)

EasyDBF

网上一直没有很好的Java读取DBF的工具类,所以就在原来公司的版本基础上手挫了一个

目前支持格式为dbase III/DBF 2.5标准格式/FOXPRO2.5标准DBF格式

您有任何问题可以邮件联系 liujiaqiang@outlook.com

完美支持中登(中国证券登记结算有限责任公司)格式,例如:D-COM(深交所)、PROP(上交所)

支持创建、插入、更新、删除功能(CRUD、增删改查)

安装

xml 复制代码
<!-- https://mvnrepository.com/artifact/io.github.buerxixi/EasyDBF -->
<dependency>
    <groupId>io.github.buerxixi</groupId>
    <artifactId>EasyDBF</artifactId>
    <version>0.2.1-RELEASE</version>
</dependency>

DBF数据结构

参考文档 DBF文件格式

ini 复制代码
参考链接:https://en.wikipedia.org/wiki/.dbf
Tab = Header(32bit) + n*Field(32bit) + 0x0D + n*Record() + 0x1A
Header(32bit) = bytes[0](版本信息) + bytes[1:3](年月日) + bytes[4:7](记录条数) + bytes[8:9](头文件长度) + bytes[10:11](记录长度)
Field(32bit) = bytes[0:10](字段名称) + bytes[11](数据类型) + bytes[12:15](偏移量) + bytes[16](字段长度) + bytes[17](字段精度)
Record = 字段类型"Character"表示文本型字符串,填写方式为左对齐右补空格,而"Numeric"为数字型字符串填写方式为右对齐,左补空格

说明

支持类型

名称 类型 Java类型 示例 代码
字符串 Character java.lang.String 中文 DBFCharField
日期(年月日) Date java.lang.String 20230122 DBFDateField
金额 Numeric java.lang.String 5.21 DBFNumField

使用方法

创建和查询默认编码为GBK格式

创建DBF

java 复制代码
// 创建结构体
String filename = "D://dbf_test/test6.dbf";
// 字符串
DBFCharField ID = new DBFCharField("ID", 10);
// 字符串
DBFCharField NAME = new DBFCharField("NAME", 20);
// 数字
DBFNumField AGE = new DBFNumField("AGE", 3,0);
// 日期
DBFDateField BIRTHDAY = new DBFDateField("BIRTHDAY");
// 金额
DBFNumField SALARY = new DBFNumField("SALARY", 10,2);
DBFWriter writer = new DBFWriter(filename);
writer.create(ID,NAME,AGE,BIRTHDAY,SALARY);

查询DBF信息

java 复制代码
// 查询Header信息
String filename = "D://dbf_test/test6.dbf";
DBFHeader header = DBFUtils.getHeader(filename);
System.out.println(header);

// 控制台输出
// DBFHeader(version=3, year=2025, month=4, day=1, numberOfRecords=2, headerLength=193, recordLength=52, languageDriver=77)

// 查询Fields信息
List<DBFField> fields = DBFUtils.getFields(filename);
for (DBFField field : fields) {
    System.out.println(field);
}

// 控制台输出
// DBFField(charset=GBK, name=ID, type=CHARACTER, offset=1, size=10, digits=0)
// DBFField(charset=GBK, name=NAME, type=CHARACTER, offset=11, size=20, digits=0)
// DBFField(charset=GBK, name=AGE, type=NUMERIC, offset=31, size=3, digits=0)
// DBFField(charset=GBK, name=BIRTHDAY, type=DATE, offset=34, size=8, digits=0)
// DBFField(charset=GBK, name=SALARY, type=NUMERIC, offset=42, size=10, digits=2)

插入数据

java 复制代码
// 创建结构体
String filename = "D://dbf_test/test6.dbf";
DBFWriter writer = new DBFWriter(filename);

// 插入数据
List<Map<String, String>> list = new  ArrayList<>();
// 数据001
Map<String, String> id001 = new HashMap<>();
id001.put("ID", "001");
id001.put("NAME", "张三");
id001.put("AGE", "25");
id001.put("BIRTHDAY", "19980510");
id001.put("SALARY", "5000.50");
list.add(id001);
// 数据002
Map<String, String> id002 = new HashMap<>();
id002.put("ID", "002");
id002.put("NAME", "李四");
id002.put("AGE", "30");
id002.put("BIRTHDAY", "19930815");
id002.put("SALARY", "8000.75");
list.add(id002);

writer.insert(list);

查询数据

java 复制代码
String filename = "D://dbf_test/test6.dbf";

try (DBFReaderIterator dbfRowIterator = new DBFReaderIterator(filename)) {
    while (dbfRowIterator.hasNext()) {
        List<DBFItem> items = dbfRowIterator.next();
        // item 包含id、fieldName、value
        // 其中id为Record的索引可用于删除、更新
        LinkedHashMap<String, String> items2Map = DBFUtils.items2Map(items);
        System.out.println(items2Map);
    }
}

// 控制台输出
// {ID=001, NAME=张三, AGE=25, BIRTHDAY=19980510, SALARY=5000.50}
// {ID=002, NAME=李四, AGE=30, BIRTHDAY=19930815, SALARY=8000.75}

删除数据(逻辑删除)

java 复制代码
// id为查询数据的DBFItem::getId()
DBFWriter writer = new DBFWriter(filename);
writer.deleteById(0);

更新数据

java 复制代码
// id为查询数据的DBFItem::getId()
DBFWriter writer = new DBFWriter(filename);
writer.updateById(0,"NAME", "刘家强");

源码构建

克隆到本地并使用maven进行构建

shell 复制代码
git clone https://github.com/buerxixi/EasyDBF.git
cd EasyDBF
mvn clean package
shell 复制代码
# 发布指令
mvn clean deploy -DskipTests=true

参考

buerxixi/EasyDBF

相关推荐
颜酱31 分钟前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_1 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble1 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟1 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖2 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707533 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.3 小时前
Day06——权限认证-项目集成
java
瑶山3 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy3 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法