论文部分内容阅读
摘要:本文分析了DBF数据表文件的数据存储结构,提出了使用Java语言直接存取DBF数据表文件的方法和关键技术,并结合示例给出了具体实现的核心代码。
关键词:DBF数据表;Java语言;文件头
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31503-03
Study on Using Java to Read the Data Structure&Info. of DBF Format
LU Ning, YANG Wei-ming
(Southwest Forestry University Computer & Info. Science Department, kunming 650224, China)
Abastract:In this paper, a technology has been given on how to read the data structure and information about DBF format using Java. Besides, the author also dedicates the source code and a instance which would be helpful for handling specific problems.
Key words:DBF database; Java; Headfile
1 引言
数据库技术是当代计算机科学的重要分支,一直也是目前计算机科学的一个重点热门研究领域,由于历史的原因,上个世纪国内大量的使用DBF文件格式的数据库,特别现在也大量运用DBF存储地理信息图像信息,使得DBF数据库在我国有着非常庞大的编制和使用队伍。本文分析了DBF数据表文件存储结构,提出了使用面向对象的Java语言直接操作DBF数据表文件的方法和核心技术,并以随机文件读取方式实现了DBF数据表记录的存取操作。这对于了解和分析现代流行的数据库底层结构、数据库驱动程序的开发、数据库的数据加密有着较大的指导意义。
2 DBF数据表文件的结构分析
DBF数据表文件由两部分组成,第一部分是表本身结构描述部分,即文件头,第二部分是表本身的数据内容,即实际存放每一个记录的数据部分。表结构说明部分又分为两个部分,前一部分是关于整个表的结构说明,共32个字节,其各字节描述信息如表1所示。后一部分从第32个字节开始到0DH(字段描述结束符或称为文件头结束标志)为止是字段描述区,每32个字节定义一个字段,包括字段名、字段类型、字段长度、小数位数等,其字段描述的各字节意义如表2所示。
表1 DBF数据表文件头描述部分(开始的32字节)
从表1 DBF数据表文件头描述部分的可以得出,记录总数占4个字节,文件头长度占2个字节,记录长度为每条记录的长度,且包括删除标志在内,因低字节在前,其计算公式如下所示:
记录总数=第4个字节+2561×第5个字节+2562×第6个字节+2563×第7个字节
文件头长度=第8个字节+2561×第9个字节
记录长度=第10个字节+2561×第11个字节
字段名以ASCII码方式存放,最大长度是10个字符,若字段名长度低于10个字符则使用空字符(0x00)填充。字段类型以ASCII码方式存放字母C、N、Y、F、D、T、L、M、G、B、I。
表2 字段描述部分(每个字段占32字节)
由上表1、表2分析可以得出,文件头的长度可按下面的公式计算(单位为字节):文件头长度=32(文件头)+32*字段个数+1(结束标志)
DBF数据表文件的结构部分的结束标志为“0DH”,占1个字节。对于VFP表文件从“0DH”所在的字节开始的263B用于描述自由表或数据库表的相关信息(若为自由表,则取值全为零)。其VFP表文件头长度=32(文件头)+32*字段个数+1(结束标志)+263。然后是数据部分,第一个记录,第二个记录,……。各记录按定长格式以ASCII码方式顺序存放。每个记录的第一个字节是删除标志。若记录被删除,则该字节为2AH(即字符“*”的ASCII码),否则为20H(即空格字符的ASCII码)。各记录间无分隔符。整个文件的结束标志为“1AH”,位于最后一个记录之后的一个字节中。
通过以上的分析,可以得出DBF数据表文件是自带文件结构描述的记录顺序存放结构。可通过顺序访问记录或根据记录长度通过直接计算定位访问记录两种的方法读取记录。
3 Java读取DBF数据表文件头信息
本文以Visual Foxpro 6.0建立自由表学生信息表(Stud.dbf),并录入示例数据,其数据表结构如表3所示。
表3 学生信息表(Stud.dbf)
3.1 读取DBF数据表结构描述部分
新建一个ReadHeader.java文件,输入如下代码,将ReadHeader.java文件保存在Stud.dbf同一文件夹下。
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReadHeader{
static RandomAccessFile RndReadDBF;
public static void main(String[] args) throws IOException {
RndReadDBF=new RandomAccessFile("Stud.dbf","rw");
RndReadDBF.skipBytes(4); //跳过前4个字节
int RecordCount=0;
//记录总数=第4个字节+2561×第5个字节+2562×第6个字节+2563×第7个字节
for(int i=0;i<32;i+=8){//读取记录总数,即4~7字节内容,采用移位异或操作实现
RecordCount|=(RndReadDBF.readByte())&0xff< int Low=RndReadDBF.readByte()&0xff;//与运算得到低字节内容
int Hight=RndReadDBF.readByte();
short TableStrucDescLen=(short)(Hight<<8|Low);
int RecordLen =RndReadDBF.readByte()&0xff;
RecordLen+=RndReadDBF.readByte()&0xff<<8;
System.out.println("记录条数:"+RecordCount);
System.out.println("表结构长度:"+TableStrucDescLen);
System.out.println("记录长度:"+RecordLen);
RndReadDBF.skipBytes(20);
RndReadDBF.close();}}
使用javac ReadHeader.java编译程序,使用java ReadHeader执行程序,其执行结果如图1所示:
关键词:DBF数据表;Java语言;文件头
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31503-03
Study on Using Java to Read the Data Structure&Info. of DBF Format
LU Ning, YANG Wei-ming
(Southwest Forestry University Computer & Info. Science Department, kunming 650224, China)
Abastract:In this paper, a technology has been given on how to read the data structure and information about DBF format using Java. Besides, the author also dedicates the source code and a instance which would be helpful for handling specific problems.
Key words:DBF database; Java; Headfile
1 引言
数据库技术是当代计算机科学的重要分支,一直也是目前计算机科学的一个重点热门研究领域,由于历史的原因,上个世纪国内大量的使用DBF文件格式的数据库,特别现在也大量运用DBF存储地理信息图像信息,使得DBF数据库在我国有着非常庞大的编制和使用队伍。本文分析了DBF数据表文件存储结构,提出了使用面向对象的Java语言直接操作DBF数据表文件的方法和核心技术,并以随机文件读取方式实现了DBF数据表记录的存取操作。这对于了解和分析现代流行的数据库底层结构、数据库驱动程序的开发、数据库的数据加密有着较大的指导意义。
2 DBF数据表文件的结构分析
DBF数据表文件由两部分组成,第一部分是表本身结构描述部分,即文件头,第二部分是表本身的数据内容,即实际存放每一个记录的数据部分。表结构说明部分又分为两个部分,前一部分是关于整个表的结构说明,共32个字节,其各字节描述信息如表1所示。后一部分从第32个字节开始到0DH(字段描述结束符或称为文件头结束标志)为止是字段描述区,每32个字节定义一个字段,包括字段名、字段类型、字段长度、小数位数等,其字段描述的各字节意义如表2所示。
表1 DBF数据表文件头描述部分(开始的32字节)
从表1 DBF数据表文件头描述部分的可以得出,记录总数占4个字节,文件头长度占2个字节,记录长度为每条记录的长度,且包括删除标志在内,因低字节在前,其计算公式如下所示:
记录总数=第4个字节+2561×第5个字节+2562×第6个字节+2563×第7个字节
文件头长度=第8个字节+2561×第9个字节
记录长度=第10个字节+2561×第11个字节
字段名以ASCII码方式存放,最大长度是10个字符,若字段名长度低于10个字符则使用空字符(0x00)填充。字段类型以ASCII码方式存放字母C、N、Y、F、D、T、L、M、G、B、I。
表2 字段描述部分(每个字段占32字节)
由上表1、表2分析可以得出,文件头的长度可按下面的公式计算(单位为字节):文件头长度=32(文件头)+32*字段个数+1(结束标志)
DBF数据表文件的结构部分的结束标志为“0DH”,占1个字节。对于VFP表文件从“0DH”所在的字节开始的263B用于描述自由表或数据库表的相关信息(若为自由表,则取值全为零)。其VFP表文件头长度=32(文件头)+32*字段个数+1(结束标志)+263。然后是数据部分,第一个记录,第二个记录,……。各记录按定长格式以ASCII码方式顺序存放。每个记录的第一个字节是删除标志。若记录被删除,则该字节为2AH(即字符“*”的ASCII码),否则为20H(即空格字符的ASCII码)。各记录间无分隔符。整个文件的结束标志为“1AH”,位于最后一个记录之后的一个字节中。
通过以上的分析,可以得出DBF数据表文件是自带文件结构描述的记录顺序存放结构。可通过顺序访问记录或根据记录长度通过直接计算定位访问记录两种的方法读取记录。
3 Java读取DBF数据表文件头信息
本文以Visual Foxpro 6.0建立自由表学生信息表(Stud.dbf),并录入示例数据,其数据表结构如表3所示。
表3 学生信息表(Stud.dbf)
3.1 读取DBF数据表结构描述部分
新建一个ReadHeader.java文件,输入如下代码,将ReadHeader.java文件保存在Stud.dbf同一文件夹下。
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReadHeader{
static RandomAccessFile RndReadDBF;
public static void main(String[] args) throws IOException {
RndReadDBF=new RandomAccessFile("Stud.dbf","rw");
RndReadDBF.skipBytes(4); //跳过前4个字节
int RecordCount=0;
//记录总数=第4个字节+2561×第5个字节+2562×第6个字节+2563×第7个字节
for(int i=0;i<32;i+=8){//读取记录总数,即4~7字节内容,采用移位异或操作实现
RecordCount|=(RndReadDBF.readByte())&0xff< int Low=RndReadDBF.readByte()&0xff;//与运算得到低字节内容
int Hight=RndReadDBF.readByte();
short TableStrucDescLen=(short)(Hight<<8|Low);
int RecordLen =RndReadDBF.readByte()&0xff;
RecordLen+=RndReadDBF.readByte()&0xff<<8;
System.out.println("记录条数:"+RecordCount);
System.out.println("表结构长度:"+TableStrucDescLen);
System.out.println("记录长度:"+RecordLen);
RndReadDBF.skipBytes(20);
RndReadDBF.close();}}
使用javac ReadHeader.java编译程序,使用java ReadHeader执行程序,其执行结果如图1所示: