使用JAVA写出DBF出现乱码和数据错位.doc_第1页
使用JAVA写出DBF出现乱码和数据错位.doc_第2页
使用JAVA写出DBF出现乱码和数据错位.doc_第3页
使用JAVA写出DBF出现乱码和数据错位.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近在做项目的时候,发现有一个导出数据成DBF文件的功能的异常。导出的DBF文件用VFP或者打开,发现数据错位的现象,本该属于前一列的数据跑到后面那一列去了,这是问题一。还有一个问题,有的数据导出去以后出现了乱码,而且数据错位很严重,根本没有一条数据可以看的。而且tomcat是不报任何错误的。 之前没整过读写DBF文件这类的东西,也不太明白这个到底是什么原因,跟了一下代码,发现写进去的数据没有乱啊,而且编码设置的GBK,写中文也不会乱码啊,都很正常。纠结了很长时间,从网上找了很多读写DBF的例子,跟我项目的也大相径庭,于是又将javadbf-01.4.0.jar这个里面的各个类反编译了,研究了一番,也没发现什么蛛丝蚂迹对我有帮助.然后我发现导出的DBF文件是从某一列以后开始产生数据错位的,该DBF总共有5列:目录号、文件号、题名、总页数、负责人。本该属于题名的列数据全都跑到总页数里面去了,后面的各列数据也都往后偏移一列。于是查看了导出的DBF文件的表结构,居然意外的发现题名那一列的宽度是0,检查代码,在代码里写进去的列宽度分别是20、30、512、30、20,因为考虑到题名字段的内容比较多,所以故意将其长度设的比较大,可是不明白为什么他会变成0呢,看了DBFField.java的setFieldLength方法,如果传进去的时候就是0的话,他应该会打印Field length should be a positive number这一句话的, public void setFieldLength(int value) if (value =256) fieldsi.setFieldLength(255); else fieldsi.setFieldLength(titleLength); 将写值的地方修改为 if(ob.toString().length()=256) if(ob.toString().matches(u4e00-u9fa50,$)&ob.toString().length()=127)/如果是中文,就只要前127个字 rowDataj = ob=null?:ob.toString().substring(0,127); else rowDataj = ob=null?:ob.toString().substring(0,255); else rowDataj = ob=null?:ob.toString(); 然后就OK了,算是解决了。 随手写了个test.java,如下:package cn.welcome.test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import com.linuxense.javadbf.DBFBase;import com.linuxense.javadbf.DBFField;import com.linuxense.javadbf.DBFReader;import com.linuxense.javadbf.DBFWriter;public class test private static FileInputStream inputStream;private static DBFReader reader; /读取dbf文件对象private static int numberOfFields;private static int numberofRecord;public static void main(String args) throws IOException DBFField fields = new DBFField3; fields0 = new DBFField(); fields0.setName(姓名); fields0.setDataType( DBFField.FIELD_TYPE_C); fields0.setFieldLength(10); fields1 = new DBFField(); fields1.setName(年龄); fields1.setDataType( DBFField.FIELD_TYPE_N); fields1.setFieldLength(768);/ fields2 = new DBFField();/ fields2.setName(性别);/ fields2.setDataType( DBFField.FIELD_TYPE_N);/ fields2.setFieldLength(12);/ fields2.setDecimalCount(2); fields2 = new DBFField(); fields2.setName(性别); fields2.setDataType( DBFField.FIELD_TYPE_C); fields2.setFieldLength(12); DBFWriter writer = new DBFWriter(); writer.setFields(fields); Object rowData = new Object3; rowData0 = 1000; rowData1 = John; rowData2 = 111; writer.addRecord(rowData); rowData = new Object3; rowData0 = 1001; rowData1 = 检查数据检查数据检查数据检查数据检查过后就会恢复的; rowData2 = 222; writer.setCharactersetName(GBK); writer.addRecord(rowData); rowData = new Object3; rowData0 = 1002; rowData1 = Rohit; rowData2 = 333; writer.addRecord(rowData); writer.write(new FileOutputStream(D:creatDBF.dbf); inputStream = new FileInputStream(D:creatDBF.dbf); reader = new DBFReader(inputStream); reader.setCharactersetName(GBK); numberOfFields = reader.getFieldCount(); numberofRecord = reader.getRecordCount(); for(int i = 0;i reader.getFieldCount(); i+) DBFField dbf = reader.getField(i);/ System.out.println(dbf.getName(); Object rowValue; while(rowValue = reader.nextRecord()!=null) for(int i = 0 ; i rowValue.length ; i+)/ System.out.pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论