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

相关推荐
日月云棠7 分钟前
10 Integer —— 最常用的整数包装类深度解析
java·后端
大鸡腿同学11 分钟前
大模型为何总 “胡说八道”?做完 RAG 知识库,我看懂了它的底层逻辑
后端
秋911 分钟前
java项目中cpu飙升排查及解决方法
java·开发语言
野生技术架构师12 分钟前
牛客网2026最新大厂Java高频面试题精选(附标准答案)
java·开发语言
PH = 715 分钟前
JAVA的SPI机制
java·开发语言
一 乐16 分钟前
高校实习信息发布网站|基于Spring Boot的高校实习信息发布网站的设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·高校实习信息发布网站
安久118 分钟前
springboot图片上传至服务器本地保存
后端
weelinking18 分钟前
【产品】11_实现后端接口——数据在背后如何流动
java·人工智能·python·sql·oracle·json·ai编程
摇滚侠26 分钟前
东方通替换tomcat,实战经验
java
喵个咪1 小时前
选择第三方IAM还是自建权限体系?中小型后台系统权限架构决策指南
后端·架构·go