使用java写出dbf出现乱码和数据错位

使用java写出dbf出现乱码和数据错位

ID:10813347

大小:30.00 KB

页数:4页

时间:2018-07-08

使用java写出dbf出现乱码和数据错位_第1页
使用java写出dbf出现乱码和数据错位_第2页
使用java写出dbf出现乱码和数据错位_第3页
使用java写出dbf出现乱码和数据错位_第4页
资源描述:

《使用java写出dbf出现乱码和数据错位》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、最近在做项目的时候,发现有一个导出数据成DBF文件的功能的异常。导出的DBF文件用VFP或者打开,发现数据错位的现象,本该属于前一列的数据跑到后面那一列去了,这是问题一。还有一个问题,有的数据导出去以后出现了乱码,而且数据错位很严重,根本没有一条数据可以看的。而且tomcat是不报任何错误的。     之前没整过读写DBF文件这类的东西,也不太明白这个到底是什么原因,跟了一下代码,发现写进去的数据没有乱啊,而且编码设置的GBK,写中文也不会乱码啊,都很正常。纠结了很长时间,从网上找了很多读写DBF的例子,跟我项目的也大相径庭,于是又

2、将javadbf-0[1].4.0.jar这个里面的各个类反编译了,研究了一番,也没发现什么蛛丝蚂迹对我有帮助..............  然后我发现导出的DBF文件是从某一列以后开始产生数据错位的,该DBF总共有5列:目录号、文件号、题名、总页数、负责人。本该属于题名的列数据全都跑到总页数里面去了,后面的各列数据也都往后偏移一列。于是查看了导出的DBF文件的表结构,居然意外的发现题名那一列的宽度是0,检查代码,在代码里写进去的列宽度分别是20、30、512、30、20,因为考虑到题名字段的内容比较多,所以故意将其长度设的比较大,

3、可是不明白为什么他会变成0呢,看了DBFField.java的setFieldLength方法,如果传进去的时候就是0的话,他应该会打印Fieldlengthshouldbeapositivenumber这一句话的, publicvoidsetFieldLength(intvalue) {   if(value<=0)   {     thrownewIllegalArgumentException("Fieldlengthshouldbeapositivenumber");   }   if(this.dataType==68) 

4、  {     thrownewUnsupportedOperationException("CannotdothisonaDatefield");   }   this.fieldLength=value; }没有打印,而且我这里是setFieldLength(titleLength),titleLength的值是动态传入的,打断点看到的是512,可确实是到了DBF文件里,题名的列宽度就变成了0,为什么呢?      于是写了1024,导出的DBF题名一列还是0,写了2048,也变成了0,于是以为凡是这个长度能整除1024,或者1

5、024能整除这个数,就会在DBF文件里变成0,又多试了几次,写了个513,导出的DBF里宽度是1,而且中文全是乱码,写514,导出的DBF里宽度是2,写256,导出的DBF里宽度是0,写257, 导出的DBF里宽度是1,后来反复研究发现,DBF文件里的宽度取的是setFieldLength(titleLength)里面传进去的titleLength%256的值,因为1024%256==0;2048%256==0;256%256==0;513%126==1;257%256==1;514%256==2,也就是说你在setFieldLen

6、gth写256和512是相同的结果。     于是心想应该是javadbf本身的问题,想试图修复这个问题,但是在javadbf的各个类里没有找到任何可能导致此问题的痕迹,因为在各个类里根本没有找到255这个数字。最后想着只能是在自己的代码里去避免这个问题了,那可是如果我题名那一列确实数据比较多我就要给他写列宽为512咋办,心想可不可以手动的在VFP里建一个文件将其宽度设为512呢,于是一试才发现,通过VFP里面的工具向导---表向导建表的时候,通过它自己增加和减小按钮列宽度增大254,再点向上按钮,增大就没变化买反映了,手动的在宽度

7、框里输了个255,右上角立刻提示范围:1-254。于是差不多清晰了,应该是DBF文件里宽度最大允许设置到254,但是我可以通过代码写入255,这应该是极限了,所以传过去的大于256的数字就解析成了对256取余的结果了。     于是我只能是去在往DBF文件写数据的代码里去避免了,我是这样处理的,将设置宽度的代码修改为:       if(titleLength>=256){            fields[i].setFieldLength(255);                      }else{           

8、fields[i].setFieldLength(titleLength);      }      将写值的地方修改为            if(ob.toString().length()>=256){             

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。