JAVAdbf:DBF文件读取与写入操作

您所在的位置:网站首页 java写入错误 JAVAdbf:DBF文件读取与写入操作

JAVAdbf:DBF文件读取与写入操作

2024-05-26 21:35| 来源: 网络整理| 查看: 265

使用JAVAdbf对DBF文件读取与写入操作。

1.引入依赖,加载javadbf-0.4.0.jar

在pom.xml文件加入依赖

com.linuxense javadbf 0.4.0

自动下载javadbf-0.4.0.jar的文件有个BUG,向DBF文件写入中文的时候会出现乱码,建议下载这个文件将其maven目录下文件替换掉。资源下载地址:Javadbf时解决DBF中文写入乱码问题javadbf-0.4.0.jar_dbf-Java文档类资源-CSDN下载

2.读取DBF数据

import com.linuxense.javadbf.DBFField; import com.linuxense.javadbf.DBFReader; import com.linuxense.javadbf.DBFWriter; /** * 读取抄表DBF文件 * @param fpath 文件全路径名 */ public void importDBF(String fpath){ String estr = "读取抄表DBF===:"; try { //--------------读取DBF-------------// BufferedInputStream bis=null; try { File file = new File(fpath); if(!file.exists()){ logger.error("文件不存在."); return ; } bis = new BufferedInputStream(new FileInputStream(file)); String vcontent; DBFReader reader=new DBFReader(bis); //设置编码格式,有时候解析出来的数据有乱码的,就可以加上这句 //dr.setCharactersetName("gb2312"); Object[] ary; int rc= reader.getRecordCount(); //逐行读取数据 for (int i = 0; i < rc; i++) { ary=reader.nextRecord(); if(ary==null) break; //读取第一个字段的值 vcontent=new String(ary[1].toString().trim().getBytes(),"utf-8"); logger.debug("字段内容:"+vcontent); }; }finally { try { if (bis!=null){ bis.close(); } }catch (Exception e) { logger.error(estr+"关闭文件失败."+ e.toString()); } } } catch (Exception e) { logger.error(estr + e.toString()); } return ; }

注意:

读取DBF文件时,如果数值字段值为空,有可能出现异常报错,如“java dbf nextRecord Failed to parse Number: empty String”,或“Failed to parse Number: For input string: “-.—””等。

这些都是因为读取该行的某字段时遇null值,而该字段类型是数值类型,读取时会自动将null当成字符串转换成数值报错。

解决的办法是,将所有数值字段初始数值改为0,而字符串字段最好也设置为空字符串,不设置null值。

3.向DBF文件写入数据

//生成DBF文件 private void writeDBF(){ String estr = "生成DBF文件===:"; try { //新文件路径 String dstfile= "D:/A.DBF"; //向新DBF文件写入数据 FileOutputStream fos=null; try { //定义DBF文件字段 DBFField[] fields = new DBFField[2]; addDBFfieldStr(fields,0,"HM",20);//创建字符串字段 addDBFfieldDecimal(fields,5,"HH",2);//创建数值字段 //定义DBFWriter实例用来写DBF文件 DBFWriter writer = new DBFWriter(); //把字段信息写入DBFWriter实例,即定义表结构 writer.setFields(fields); //写入记录 Object[] rowData = new Object[2]; rowData[0] = "户名1"; rowData[1] = 22.00;//金额 writer.addRecord(rowData); Object[] rowData2 = new Object[2]; rowData[0] = "户名2"; rowData[1] = 98.00;//金额 writer.addRecord(rowData2); //定义输出流,并关联的一个文件 fos = new FileOutputStream(dstfile); //写入数据 writer.setCharactersetName("GBK");//设置GBK编码避免中文乱码 writer.write(fos); }finally { try { if (fos != null) { fos.close(); } } catch (Exception e) { rMsg.setResultMsg(e.getCause().getMessage()); logger.error(estr + "关闭文件失败." + e.toString()); } } } catch (Exception e) { logger.error(estr + rMsg.getResultMsg()); } return ; } //创建DBF字符串字段 private void addDBFfieldStr(DBFField[] fields,int index,String fieldName,int fieldLength){ // DBFField.FIELD_TYPE_C: // 字符串 // DBFField.FIELD_TYPE_M: // 可以用字符串传值 // DBFField.FIELD_TYPE_D: // 时期 // DBFField.FIELD_TYPE_F: // 数值 用Double // DBFField.FIELD_TYPE_N: // 数值 用Double // DBFField.FIELD_TYPE_L: // Boolean fields[index] = new DBFField(); fields[index].setName(fieldName); fields[index].setDataType(DBFField.FIELD_TYPE_C); fields[index].setFieldLength(fieldLength); } //创建DBF数值字段 private void addDBFfieldDecimal(DBFField[] fields,int index,String fieldName,int decimalCount){ fields[index] = new DBFField(); fields[index].setName(fieldName); fields[index].setDataType(DBFField.FIELD_TYPE_N); fields[index].setFieldLength(18); fields[index].setDecimalCount(decimalCount); }

Javadbf写入DBF文件,有两种方式:

1.创建新文件,然后在该文件内创建字段,然后逐行追加记录写入数据。

2.在原文件上进行追加记录,方法是 在文中DBFWriter writer = new DBFWriter();这个地方使用 DBFWriter writer = new DBFWriter(new File(dstfile)); dstfile是文件路径,不需要再定义表字段类型,可以直接对字段数组赋值并追加记录,最后使用writer.write();提交即可。

//生成DBF文件 private void writeDBF(){ String estr = "生成DBF文件===:"; try { //新文件路径 String dstfile= "D:/A.DBF"; //定义DBF文件字段 DBFField[] fields = new DBFField[2]; //定义DBFWriter实例用来写DBF文件 DBFWriter writer = new DBFWriter(new File(dstfile)); //写入记录 Object[] rowData = new Object[2]; rowData[0] = "户名1"; rowData[1] = 22.00;//金额 writer.addRecord(rowData); Object[] rowData2 = new Object[2]; rowData[0] = "户名2"; rowData[1] = 98.00;//金额 writer.addRecord(rowData2); //写入数据 writer.setCharactersetName("GBK");//设置GBK编码避免中文乱码 writer.write(); } catch (Exception e) { logger.error(estr + rMsg.getResultMsg()); } return ; }

写入中文的时候,需要特别注意设置writer的编码类型,这里设置为GBK写入的中文才会显示正常。

添加字段时,需要设置DBFField的数据类型,类型对应的枚举值,已经列在方法addDBFfieldStr的注释里面了,可以对应参考下。

异常处理

如果出现“Invalid value for field ”这样的异常报错,解决办法是在赋值数值类型的时候需要数值转换成Doulble类型,如

rowData[6] = 0;//错误

rowData[6] = Double.valueOf(0);//正确



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3