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

EasyDBF

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

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

您有任何问题可以邮件联系 [email protected]

完美支持中登(中国证券登记结算有限责任公司)格式,例如: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

相关推荐
草捏子40 分钟前
最终一致性避坑指南:小白也能看懂的分布式系统生存法则
后端
一个public的class1 小时前
什么是 Java 泛型
java·开发语言·后端
士别三日&&当刮目相看1 小时前
JAVA学习*Object类
java·开发语言·学习
快来卷java2 小时前
MySQL篇(一):慢查询定位及索引、B树相关知识详解
java·数据结构·b树·mysql·adb
凸头2 小时前
I/O多路复用 + Reactor和Proactor + 一致性哈希
java·哈希算法
头孢头孢2 小时前
k8s常用总结
运维·后端·k8s
TheITSea3 小时前
后端开发 SpringBoot 工程模板
spring boot·后端
Asthenia04123 小时前
编译原理中的词法分析器:从文本到符号的桥梁
后端
慵懒学者3 小时前
15 网络编程:三要素(IP地址、端口、协议)、UDP通信实现和TCP通信实现 (黑马Java视频笔记)
java·网络·笔记·tcp/ip·udp
anda01093 小时前
11-leveldb compact原理和性能优化
java·开发语言·性能优化