`
linwei_211
  • 浏览: 191443 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

使用JAVA写出DBF意外出现失败

 
阅读更多

      目前在做项目的时候,用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 文件具有重要的应用价值。本文将介绍使用 Java 实现对 dbf 文件的简单读写,包括读写 dbf 文件的基本步骤、相关类的介绍、代码...

    java 写dbf文件

    打包文件路径 : dbf4j\artifacts\dbf4j_jar java -jar dbf4j.jar test.xml 20190416 test.xml 是配置文件,20190416是日期参数

    java 读写 DBF 文件 xBaseJ

    本篇文章将详细探讨如何使用Java来读写DBF文件,重点介绍xBaseJ库,这是一个专门为Java设计的、用于处理DBF文件的开源库。 首先,我们要理解DBF文件的结构。DBF文件是一种基于文本的数据库格式,由一系列记录组成,...

    dbf-jdbc-wisecoders,JAVA 读写DBF文件工具包

    1. **JDBC接口**:`dbf-jdbc-wisecoders`通过提供一个类似于JDBC(Java Database Connectivity)的接口,让Java开发者可以使用他们熟悉的SQL查询来访问和操作DBF文件。这大大简化了代码编写,使得DBF文件的处理如同...

    DBF.rar_DBF_dbf java_java dbf_读取dbf

    这篇内容将详细介绍如何使用Java来读取DBF文件。 1. DBF文件结构: DBF文件主要由文件头、字段定义记录和数据记录三部分组成。文件头包含了文件的基本信息,如记录数量、创建日期等。字段定义记录则定义了每个列的...

    用JavaDBF操作(读、写)DBF文件

    写DBF文件的过程类似,但需要使用DBFWriter。首先创建一个DBFWriter实例,定义表的字段,然后添加记录。比如: ```java DBFWriter writer = new DBFWriter("path_to_output_file.dbf"); writer.addField(new ...

    java快速导出几十万百万生成DBF文件数据后台内附有javadbf.jar

    本文将深入探讨如何使用Java来快速导出大量数据到DBF文件,以及如何利用`javadbf.jar`库进行高效操作。 首先,DBF文件是基于dBase III、IV或FoxPro等早期数据库管理系统的文件格式。它以ASCII文本存储表格数据,...

    java解析dbf文件方案.pdf

    Java 解析 DBF 文件方案是使用 Java 语言来读取和解析 DBF 文件的方法。DBF 文件是一种常见的数据库文件格式,广泛应用于许多行业。为了读取和解析 DBF 文件,需要使用 Java 语言中的数据库连接和 SQL 语句。 在这...

    javadbf源码

    JavaDBF库会抛出相应的异常,如`FileNotFoundException`、`DbfFormatException`等,需要在使用时进行捕获和处理。 7. 性能与效率 虽然JavaDBF库提供了方便的API,但其性能可能不如原生的二进制操作。在处理大量...

    java直接调用dbf表

    但是,如果不想引入额外的依赖库,那么可以通过使用ODBC驱动的方式,借助Java的JDBC接口直接访问DBF文件。 #### 二、ODBC与JDBC简介 - **ODBC(Open Database Connectivity)**:是一种开放的标准应用程序接口...

    java操作dbf文件

    `javadbf`库应该提供了相应的异常处理机制,确保在出现问题时能捕获并处理错误。同时,了解不同版本的DBF文件的差异也非常重要,因为不同版本的DBF可能有不同的字段类型和结构。 5. **性能优化**: 对于大量数据的...

    java生成dbf文件

    根据需求生成dbf文件,根据模板dbf文件生成特定格式的dbf文件,可以帮助解决项目中的特殊需求问题,更好地完整项目。 dbf文件是一种存储数据的格式,所以在某些需求中,会需要使用。

    java 实现DBF文件读取与创建

    本篇文章将深入探讨如何使用Java实现DBF文件的读取与创建。 1. **DBF文件格式介绍** DBF文件格式源于dBase,是早期个人计算机上的流行数据库系统。每个DBF文件包含表的结构信息(字段名、类型、长度等)和数据记录...

    Java下读写DBF数据库文件格式研究.pdf

    DBF数据库文件格式是一种历史悠久的数据存储格式,最早与Dbase相关联,并在后续的数据库管理系统如FoxBase和Visual FoxPro中得以使用。DBF文件为数据存储提供了一种简洁的二进制结构,这种结构在较老的计算机系统和...

    解决了DBF数据和表头乱码的javadbf.jar

    "dbf java"标签表明这是一个关于Java处理DBF文件的专题,对于那些需要在Java应用中处理DBF数据的开发者来说,这个修复后的javadbf.jar及其使用说明是一个宝贵的资源。通过合理使用,可以避免因编码问题导致的数据...

    通过java操作dbf文件的javadbf

    通过java操作dbf文件的javadbf,含源码,api

    java解析dbf文件三种方法、以及解析驱动

    以上介绍了使用Java解析DBF文件的三种方法,每种方法都有其适用场景。对于简单的数据读取任务,推荐直接按行读取;对于需要进行复杂查询和数据处理的任务,则推荐使用JDBC方式,特别是通过安装驱动的方式,可以更好...

    java代码DBF转Text

    标题中的"java代码DBF转Text"表明我们要讨论的是使用Java编程语言实现DBF文件向Text文件的转换过程。描述中的"包括javadbf.jar包"提示我们,这个转换过程可能需要用到一个名为`javadbf.jar`的第三方库,它提供了解析...

    java读取DBF解决方案(可以解决javadbf.jar对DBF部分中文乱码和错行等杂症)

    在"系统DSN"中找到刚安装驱动后增加的项"Microsoft visual foxpro Driver",双击编辑出现如图2: 图2 3、java连接ODBC private String url = "jdbc:odbc:VF";//这里连接的是student数据源配置的java语句 ...

    DBF java 操作 dbf foxpro 例子

    本篇将详细探讨如何使用Java操作DBF文件,以及涉及到的相关知识点。 首先,DBF文件是dBase系列数据库管理系统(包括FoxPro)创建的一种表格文件格式。它包含了表的结构定义和实际数据,支持字段类型如字符、数字、...

Global site tag (gtag.js) - Google Analytics