Java解析DBF文件,其中遇到的些问题及解决办法

最近要做一个程序,数据源是DBF的文件,我用Java解析它,首先需要下载个Java专用jar包javadbf-0.4.0.jar,这个是最新版的。解析代码如下:

public static void main(String[] args) {

try{
Object[] obj=null;
//创建文件流
InputStream is=new FileInputStream("Q.DBF");
//初始化DBFReader实例
DBFReader df=new DBFReader(is);

//设置编码格式,有时候解析出来的数据有乱码的,就可以加上这句
df.setCharactersetName("gb2312");
//得到文件字段数
int fileCount=df.getFieldCount();
//取出字段信息
for(int i=0;i<fileCount;i++){
DBFField field=df.getField(i);
// System.out.print(field.getName()+"\t");
}
System.out.println();
int i=0;
while((obj=df.nextRecord())!=null){ //解析有些DBF文件时在这句会报错,也就是读取数据转成Object数组时出错
for(int j=0;j<obj.length;j++){
System.out.print(obj[j]+"\t");
// System.out.println(obj[1]);
}
if(i++>20)break;
System.out.println();
}
is.close();
}catch(Exception ex){ex.printStackTrace();}
}

发现错误一:

while((obj=df.nextRecord())!=null){ //解析有些DBF文件时在这句会报错,也就是读取数据转成Object数组时出错 。

错误:Failed to parse Number: For input string: "-.---" ,经过我仔细查找和查看DBF源文件,发现是因为DBF文件里有特殊字符无法解析造成的。不得与情况下,找到了javadbf-0.4.0.jar 源码。经过调试把里面DBFReader类里面的:


case 'N':

try {

byte t_numeric[] = new byte[ this.header.fieldArray[i].getFieldLength()];
dataInputStream.read( t_numeric);
t_numeric = Utils.trimLeftSpaces( t_numeric);

String strtemp = new String( t_numeric);
if(strtemp.equals("-.---") || strtemp.equals("-")){
recordObjects[i]=0.0;//这行代码,在你只需要输出里面的数据时,可以不用加,不会出错。当你要读用这里面的数据时就必须加。
continue;
} //这里是我自己加上的代码,就是屏蔽这个错误的。

if( t_numeric.length > 0 && !Utils.contains( t_numeric, (byte)'?')) {

recordObjects[i] = new Double( new String( t_numeric));
}
else {

recordObjects[i] = null;
}
}

错误二:

就是DBF文件里规范,0x20的标记表示不删除的,0x2A的标记表示删除的。但是里面的数据还是正常,并且有更新会更新的,只是我们在读取的时候有0x2A标记的我们是读取不出来的。所有在这里又要处理了,经过调试源码,修改一个地方就可以。

boolean isDeleted = false;
do {

if( isDeleted) {

dataInputStream.skip( this.header.recordLength-1);
}

int t_byte = dataInputStream.readByte();
if( t_byte == END_OF_DATA) {

return null;
}

//isDeleted = ( t_byte == '*'); //这句是原始的

// isDeleted=false;//这是修改后的,这样修改后,不论是什么标记就都可以正常读取了。
} while( isDeleted);

目前就发现这两种情况的错误,有时候这两个错误会在同时出现,所以有时候必须这两处都要修改。

这个东西写出来,供大家分享。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java解析DBF文件可以使用Apache Commons IO和Apache Commons Lang库。以下是一个简单的示例代码,演示了如何读取DBF文件并输出其内容: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.time.DateUtils; public class DBFReader { private String fileName; private int headerLength; private int recordLength; public DBFReader(String fileName) { this.fileName = fileName; } public void read() throws IOException { FileInputStream inputStream = new FileInputStream(fileName); byte[] headerBytes = new byte[32]; IOUtils.read(inputStream, headerBytes); headerLength = NumberUtils.toInt(StringUtils.substring(headerBytes, 8, 10)); recordLength = NumberUtils.toInt(StringUtils.substring(headerBytes, 10, 12)); byte[] recordBytes = new byte[recordLength]; while (IOUtils.read(inputStream, recordBytes) != -1) { String recordString = new String(recordBytes, "ISO-8859-1"); System.out.println(recordString); } } public static void main(String[] args) throws Exception { DBFReader reader = new DBFReader("example.dbf"); reader.read(); } } ``` 这个示例代码使用了Apache Commons IO和Apache Commons Lang库来读取DBF文件。它首先读取文件头,然后使用记录长度来读取每个记录。在每个记录中,它将字节数组转换为字符串,并将其输出到控制台。请注意,DBF文件使用ISO-8859-1编码,因此我们需要使用该编码将字节数组转换为字符串。此外,我们还需要使用Apache Commons Lang库来解析整数和日期值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值