目前在做项目的时候,用java导出DBF的时候又遇到一个问题,因为我导出DBF的列是动态的,是查出数据库不同的表直接然后去解析去生成的DBF文件的各列,所以就出现有时候有的表导出失败,报的异常是
java.lang.IllegalArgumentException: Field name should be of length 0-10,这种异常的话还比较明确,有的时候报的是java.lang.NegativeArraySizeException,意思是数组越界了,数组索引为赋值。
后来把那些失败的数据,单独写了个测试类,便发现了一个问题,DBF文件的列名最多支持10个字符。我的解决办法是写出DBF的时候,对列名进行判断,如果包含中文而且长度超过10个字符,就只取前五个汉字。总不能让代码报错,导不出去DBF文件,被用户骂的好.....
后来解决了上述问题发现列内容没有超过255,导出的DBF也出现了中文乱码的情况,比如一列内容为“你好中国”导出以后便成为“你好?”,“测试”导出以后就变为“测”,而内容是全英文的,却可以正常导出,内容中包含中文,导致导出DBF文件中文乱码或者丢失一半字数中文。也就是下面蓝色显示代码解决的此问题,如果包含中文就要补够2倍中文字数个空格,否则会导致中文乱码,可能dbf的那个jar包中没有对汉字进行处理英文他知道是一个字符,汉字他不知道是几个字符,所以就出问题了,于是只能手动的给补空格,遇到多少个汉字,补够双倍中文字数的空格,解决导出丢汉字的问题。
不过我之所以又将蓝色那段代码注释掉了,是因为我这个项目不仅需要导出DBF,还需要导入DBF,发现将导出的DBF导进去的时候,读取DBF文件内容的时候,老是报jar包中空指针异常,那便是之前导出的时候补的空格导致的问题,于是修改了jar源码包,解决导出问题:内容中包含中文,导致中文乱码或者丢失一半字数中文。
我在下面也挂上修改前、后的jar包,javadbf-0[1].4.0.jar是原始的,javadbf-0[2].4.0.jar是修改后的。
如果此篇文章没有可以帮到大家的,还可以查看另外一篇文章,《使用JAVA写出DBF出现乱码和数据错位》,连接地址如下:http://linwei-211.iteye.com/blog/1207354
直接贴上本次测试代码吧,用代码说话。
package cn.test.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.regex.Pattern;
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文件对象
public static void main(String args[]) throws IOException{
String str="姓名,性别,籍贯,家庭成员,家庭详细住址";
String s[]=str.split(",");
DBFField[] fields = new DBFField[s.length];
Object[] rowData = new Object[s.length];
DBFWriter writer = new DBFWriter();
writer.setCharactersetName("GBK");
for(int i=0;i<s.length;i++){
str = s[i];
fields[i] = new DBFField();
// ********这一段代码避免列名超过10个字符,造成的异常 start***************************************************//
/**
* 第一种异常信息:
*java.lang.IllegalArgumentException: Field name should be of length 0-10
* at com.linuxense.javadbf.DBFField.setName(DBFField.java:122)
* 第二种异常信息:
* java.lang.NegativeArraySizeException
* at com.linuxense.javadbf.DBFField.write(DBFField.java:78)
* at com.linuxense.javadbf.DBFHeader.write(DBFHeader.java:129)
* at com.linuxense.javadbf.DBFWriter.write(DBFWriter.java:218)
*
*
*/
Pattern pWord = Pattern.compile("[\u4e00-\u9fa5]");//校验中文的正则表达式
if(pWord.matcher(str).find()&&str.length()>5){//如果是中文,就只要前5个字,原因是dbf文件的列名只支持最多10个字符
fields[i].setName(str.substring(0,5));
}else{
// ********这一段代码避免列名超过10个字符,造成的异常 end***************************************************//
fields[i].setName(str);
}
fields[i].setDataType(DBFField.FIELD_TYPE_C);
fields[i].setFieldLength(200);
String value=s[i]+i;
// *******这一段代码避免内容中包含中文,导致中文乱码或者丢失一半字数中文 start*******************//
// int m = value.getBytes().length;
// String blank="";
// if(pWord.matcher(value).find()){//如果包含中文就要补够2倍中文字数个空格,否则会导致中文乱码
// for(int j=0;j<m;j++){
// blank+=" ";
// }
// }
// value=value;
// *******这一段代码避免内容中包含中文,导致中文乱码或者丢失一半字数中文 end*******************//
rowData[i]=value;
}
writer.setFields(fields);
writer.addRecord(rowData);
writer.write(new FileOutputStream("D:\\creatDBF.dbf"));
inputStream = new FileInputStream("D:\\creatDBF.dbf");
reader = new DBFReader(inputStream);
reader.setCharactersetName("GBK");
// 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.println(rowValue[i]);
}
}
}
}
分享到:
相关推荐
使用 Java 实现对 dbf 文件的简单读写 Java 是一种广泛使用的编程语言,对于读写 dbf 文件具有重要的应用价值。本文将介绍使用 Java 实现对 dbf 文件的简单读写,包括读写 dbf 文件的基本步骤、相关类的介绍、代码...
打包文件路径 : dbf4j\artifacts\dbf4j_jar java -jar dbf4j.jar test.xml 20190416 test.xml 是配置文件,20190416是日期参数
本篇文章将详细探讨如何使用Java来读写DBF文件,重点介绍xBaseJ库,这是一个专门为Java设计的、用于处理DBF文件的开源库。 首先,我们要理解DBF文件的结构。DBF文件是一种基于文本的数据库格式,由一系列记录组成,...
写DBF文件的过程类似,但需要使用DBFWriter。首先创建一个DBFWriter实例,定义表的字段,然后添加记录。比如: ```java DBFWriter writer = new DBFWriter("path_to_output_file.dbf"); writer.addField(new ...
1. **JDBC接口**:`dbf-jdbc-wisecoders`通过提供一个类似于JDBC(Java Database Connectivity)的接口,让Java开发者可以使用他们熟悉的SQL查询来访问和操作DBF文件。这大大简化了代码编写,使得DBF文件的处理如同...
这篇内容将详细介绍如何使用Java来读取DBF文件。 1. DBF文件结构: DBF文件主要由文件头、字段定义记录和数据记录三部分组成。文件头包含了文件的基本信息,如记录数量、创建日期等。字段定义记录则定义了每个列的...
本文将深入探讨如何使用Java来快速导出大量数据到DBF文件,以及如何利用`javadbf.jar`库进行高效操作。 首先,DBF文件是基于dBase III、IV或FoxPro等早期数据库管理系统的文件格式。它以ASCII文本存储表格数据,...
Java 解析 DBF 文件方案是使用 Java 语言来读取和解析 DBF 文件的方法。DBF 文件是一种常见的数据库文件格式,广泛应用于许多行业。为了读取和解析 DBF 文件,需要使用 Java 语言中的数据库连接和 SQL 语句。 在这...
JavaDBF库会抛出相应的异常,如`FileNotFoundException`、`DbfFormatException`等,需要在使用时进行捕获和处理。 7. 性能与效率 虽然JavaDBF库提供了方便的API,但其性能可能不如原生的二进制操作。在处理大量...
但是,如果不想引入额外的依赖库,那么可以通过使用ODBC驱动的方式,借助Java的JDBC接口直接访问DBF文件。 #### 二、ODBC与JDBC简介 - **ODBC(Open Database Connectivity)**:是一种开放的标准应用程序接口...
`javadbf`库应该提供了相应的异常处理机制,确保在出现问题时能捕获并处理错误。同时,了解不同版本的DBF文件的差异也非常重要,因为不同版本的DBF可能有不同的字段类型和结构。 5. **性能优化**: 对于大量数据的...
根据需求生成dbf文件,根据模板dbf文件生成特定格式的dbf文件,可以帮助解决项目中的特殊需求问题,更好地完整项目。 dbf文件是一种存储数据的格式,所以在某些需求中,会需要使用。
本篇文章将深入探讨如何使用Java实现DBF文件的读取与创建。 1. **DBF文件格式介绍** DBF文件格式源于dBase,是早期个人计算机上的流行数据库系统。每个DBF文件包含表的结构信息(字段名、类型、长度等)和数据记录...
DBF数据库文件格式是一种历史悠久的数据存储格式,最早与Dbase相关联,并在后续的数据库管理系统如FoxBase和Visual FoxPro中得以使用。DBF文件为数据存储提供了一种简洁的二进制结构,这种结构在较老的计算机系统和...
"dbf java"标签表明这是一个关于Java处理DBF文件的专题,对于那些需要在Java应用中处理DBF数据的开发者来说,这个修复后的javadbf.jar及其使用说明是一个宝贵的资源。通过合理使用,可以避免因编码问题导致的数据...
通过java操作dbf文件的javadbf,含源码,api
以上介绍了使用Java解析DBF文件的三种方法,每种方法都有其适用场景。对于简单的数据读取任务,推荐直接按行读取;对于需要进行复杂查询和数据处理的任务,则推荐使用JDBC方式,特别是通过安装驱动的方式,可以更好...
标题中的"java代码DBF转Text"表明我们要讨论的是使用Java编程语言实现DBF文件向Text文件的转换过程。描述中的"包括javadbf.jar包"提示我们,这个转换过程可能需要用到一个名为`javadbf.jar`的第三方库,它提供了解析...
在"系统DSN"中找到刚安装驱动后增加的项"Microsoft visual foxpro Driver",双击编辑出现如图2: 图2 3、java连接ODBC private String url = "jdbc:odbc:VF";//这里连接的是student数据源配置的java语句 ...
本篇将详细探讨如何使用Java操作DBF文件,以及涉及到的相关知识点。 首先,DBF文件是dBase系列数据库管理系统(包括FoxPro)创建的一种表格文件格式。它包含了表的结构定义和实际数据,支持字段类型如字符、数字、...