`
viwo
  • 浏览: 221865 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多

JavaDBF操作(读、写)DBF文件<o:p></o:p>

最近的一个项目需要动态生成DBF文件,用到JavaDBF,简单介绍一下<o:p></o:p>

官方网站:http://javadbf.sarovar.org/<o:p></o:p>

官方英文指南:http://sarovar.org/docman/view.php/32/23/javadbf-tutorial.html<o:p></o:p>

最新版本:<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">0.4.0</st1:chsdate>,最后发布时间还是在<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="1" month="4" year="2004">200441</st1:chsdate>,看来DBF真是老了。老归老,有些时候还是得用。<o:p></o:p>

下面是分别是读取和写DBF文件以及其他操作函数(关键信息的解释我放在了注释里,这样看起来会更方便):<o:p></o:p>

读取DBF文件:<o:p></o:p>

<o:p>
java 代码
  1. public static void readDBF(String path)   
  2.   
  3.     {   
  4.   
  5.        InputStream fis = null;   
  6.   
  7.         try    
  8.   
  9.         {   
  10.   
  11.             //读取文件的输入流   
  12.   
  13.             fis  = new FileInputStream(path);   
  14.   
  15.             //根据输入流初始化一个DBFReader实例,用来读取DBF文件信息   
  16.   
  17.             DBFReader reader = new DBFReader(fis);    
  18.   
  19.             //调用DBFReader对实例方法得到path文件中字段的个数   
  20.   
  21.             int fieldsCount = reader.getFieldCount();   
  22.   
  23.             //取出字段信息   
  24.   
  25.             forint i=0; i<fieldsCount; i++)    
  26.   
  27.             {   
  28.   
  29.               DBFField field = reader.getField(i);   
  30.   
  31.               System.out.println(field.getName());   
  32.   
  33.             }   
  34.   
  35.             Object[] rowValues;   
  36.   
  37.             //一条条取出path文件中记录   
  38.   
  39.             while((rowValues = reader.nextRecord()) != null)    
  40.   
  41.             {   
  42.   
  43.               forint i=0; i<rowValues.length; i++)    
  44.   
  45.               {   
  46.   
  47.                 System.out.println(rowValues[i]);   
  48.   
  49.               }   
  50.   
  51.             }   
  52.   
  53.           }   
  54.   
  55.           catch(Exception e)    
  56.   
  57.           {   
  58.   
  59.           e.printStackTrace();   
  60.   
  61.           }   
  62.   
  63.           finally  
  64.   
  65.           {   
  66.   
  67.           try{   
  68.   
  69.                fis.close();   
  70.   
  71.           }catch(Exception e){}   
  72.   
  73.           }   
  74.   
  75.     }   

 

DBF文件:

java 代码

  1. public static void writeDBF(String path)   
  2.   
  3.   
  4.   
  5.  OutputStream fos = null;   
  6.   
  7.  try  
  8.   
  9.  {   
  10.   
  11.      //定义DBF文件字段   
  12.   
  13.      DBFField[] fields = new DBFField[3];   
  14.   
  15.      //分别定义各个字段信息,setFieldName和setName作用相同,   
  16.   
  17.      //只是setFieldName已经不建议使用   
  18.   
  19.      fields[0] = new DBFField();   
  20.   
  21.      //fields[0].setFieldName("emp_code");   
  22.   
  23.      fields[0].setName("semp_code");   
  24.   
  25.      fields[0].setDataType(DBFField.FIELD_TYPE_C);   
  26.   
  27.      fields[0].setFieldLength(10);   
  28.   
  29.   
  30.   
  31.      fields[1] = new DBFField();   
  32.   
  33.      //fields[1].setFieldName("emp_name");   
  34.   
  35.      fields[1].setName("emp_name");   
  36.   
  37.      fields[1].setDataType(DBFField.FIELD_TYPE_C);   
  38.   
  39.      fields[1].setFieldLength(20);   
  40.   
  41.   
  42.   
  43.      fields[2] = new DBFField();   
  44.   
  45.      //fields[2].setFieldName("salary");   
  46.   
  47.      fields[2].setName("salary");   
  48.   
  49.      fields[2].setDataType(DBFField.FIELD_TYPE_N);   
  50.   
  51.      fields[2].setFieldLength(12);   
  52.   
  53.      fields[2].setDecimalCount(2);   
  54.   
  55.   
  56.   
  57.      //DBFWriter writer = new DBFWriter(new File(path));   
  58.   
  59.      //定义DBFWriter实例用来写DBF文件   
  60.   
  61.      DBFWriter writer = new DBFWriter();   
  62.   
  63.      //把字段信息写入DBFWriter实例,即定义表结构   
  64.   
  65.      writer.setFields(fields);   
  66.   
  67.      //一条条的写入记录   
  68.   
  69.      Object[] rowData = new Object[3];   
  70.   
  71.      rowData[0] = "1000";   
  72.   
  73.      rowData[1] = "John";   
  74.   
  75.      rowData[2] = new Double(5000.00);   
  76.   
  77.      writer.addRecord(rowData);   
  78.   
  79.      rowData = new Object[3];   
  80.   
  81.      rowData[0] = "1001";   
  82.   
  83.      rowData[1] = "Lalit";   
  84.   
  85.      rowData[2] = new Double(3400.00);   
  86.   
  87.      writer.addRecord(rowData);   
  88.   
  89.      rowData = new Object[3];   
  90.   
  91.      rowData[0] = "1002";   
  92.   
  93.      rowData[1] = "Rohit";   
  94.   
  95.      rowData[2] = new Double(7350.00);   
  96.   
  97.      writer.addRecord(rowData);   
  98.   
  99.      //定义输出流,并关联的一个文件   
  100.   
  101.      fos = new FileOutputStream(path);   
  102.   
  103.      //写入数据   
  104.   
  105.      writer.write(fos);   
  106.   
  107.      //writer.write();   
  108.   
  109.  }catch(Exception e)   
  110.   
  111.  {   
  112.   
  113.      e.printStackTrace();   
  114.   
  115.  }   
  116.   
  117.  finally  
  118.   
  119.  {   
  120.   
  121.      try{   
  122.   
  123.      fos.close();   
  124.   
  125.      }catch(Exception e){}   
  126.   
  127.  }   

注意:writer.addRecord(rowData)时并不真正写入数据,在最后writer.write(fos)时才会把数据写入DBF文件,之前addRecord的数据暂时存放在内存中。如果数据量过大,这种方式显然不适合,内存中存储的数据过多,所以JavaDBF提供了另外一种机制来解决这个问题:Sync Mode(同步模式)。使用方法如下:

new DBFWriter(new File(path))实例化DBFWriter类,最后写入数据时用writer.write(),这样在每次addRecord时数据就被写入的DBF文件中。

因为初始化DBFWriter时传递了DBF文件,所以不用再定义DBF表结构,如果你定义并加载表结构会报异常。

 

 下面这个函数会根据你传入的数据信息自动生成DBF文件,这样以后我们只要构造好数组,就可以直接得到DBF文件,不用每次都去写重复的代码。

 

java 代码
  1. public static void generateDbfFromArray(   
  2.   
  3.                                    String dbfName,   
  4.   
  5.                                    String[] strutName,   
  6.   
  7.                                    byte[] strutType,   
  8.   
  9.                                    int[] strutLength,   
  10.   
  11.                                    Object[][] data   
  12.   
  13.                                   )   
  14.   
  15. {   
  16.   
  17.    OutputStream fos = null;   
  18.   
  19.    try  
  20.   
  21.    {   
  22.   
  23.        int fieldCount = strutName.length;   
  24.   
  25.        DBFField[] fields = new DBFField[fieldCount];   
  26.   
  27.        for(int i=0;i<fieldCount;i++)   
  28.   
  29.        {   
  30.   
  31.           fields[i] = new DBFField();   
  32.   
  33.           fields[i].setName(strutName[i]);   
  34.   
  35.           fields[i].setDataType(strutType[i]);   
  36.   
  37.           fields[i].setFieldLength(strutLength[i]);   
  38.   
  39.        }   
  40.   
  41.        DBFWriter writer = new DBFWriter();   
  42.   
  43.        writer.setFields(fields);   
  44.   
  45.        for(int i=0;i<fieldCount;i++)   
  46.   
  47.        {   
  48.   
  49.        writer.addRecord(data[i]);   
  50.   
  51.        }   
  52.   
  53.        fos = new FileOutputStream(dbfName);   
  54.   
  55.        writer.write(fos);   
  56.   
  57.    }   
  58.   
  59.    catch(Exception e)   
  60.   
  61.    {   
  62.   
  63.        e.printStackTrace();   
  64.   
  65.    }   
  66.   
  67.    finally  
  68.   
  69.    {   
  70.   
  71.        try{   
  72.   
  73.        fos.close();   
  74.   
  75.        }catch(Exception e){}   
  76.   
  77.    }   
  78.   
  79. }  

 

可以看到定义JavaDBF表结构或者添加数据时是通过传递数组实现,也就是说只要我们有了这些用来构造表结果和表示结果集的数组就有了DBF文件,那么我们可以通过类似下面这样的函数把ResultSet信息转换成数组信息。

java 代码
  1. public static void ResultsetToArray(ResultSet rs)   
  2.   
  3. {   
  4.   
  5.    try  
  6.   
  7.    {   
  8.   
  9.        ResultSetMetaData meta = rs.getMetaData();   
  10.   
  11.        int columnCount = meta.getColumnCount();   
  12.   
  13.        String[] strutName = new String[columnCount];   
  14.   
  15.        byte[] strutType = new byte[columnCount];   
  16.   
  17.        rs.last();   
  18.   
  19.        int itemCount = rs.getRow();   
  20.   
  21.        rs.first();   
  22.   
  23.        Object[][] data = new Object[columnCount][itemCount];   
  24.   
  25.        for(int i=0;i<columnCount;i++)   
  26.   
  27.        {   
  28.   
  29.           strutType[i] = (byte)meta.getColumnType(i);   
  30.   
  31.           strutName[i] = meta.getColumnName(i);   
  32.   
  33.        }   
  34.   
  35.   
  36.   
  37.        for(int i=0;rs.next();i++)   
  38.   
  39.        {      
  40.   
  41.           for(int j=0;j<columnCount;j++)   
  42.   
  43.           {   
  44.   
  45.               data[i][j] = rs.getObject(j);   
  46.   
  47.           }   
  48.   
  49.        }   
  50.   
  51.    }   
  52.   
  53.    catch(Exception e)   
  54.   
  55.    {   
  56.   
  57.        e.printStackTrace();   
  58.   
  59.    }   
  60.   
  61. }  

细心的读者可能会发现:strutType[i] = (byte)meta.getColumnType(i)这条语句是不可靠的,的却,这里的代码我省略了,JavaDBF中的字段类型表示和ResultSetMetaData中的字段类型表示应该是不一致的,这里做一个类型映射和转换即可。

 

 

 

</o:p>
分享到:
评论
9 楼 kimfly 2007-11-10  
有谁操作过dbf中包含字段是日期时间型的吗,看了下源代码,没有处理这种类型的,有操作过的麻烦告诉下,谢谢。
8 楼 jvincent 2007-11-10  
读的时候发现乱码如何解决的?用什么编码?

解决了,dbfReader.setCharactersetName("GB2312");
7 楼 killpoer3 2007-10-22  
DBFField里面的字段类型各自对应的数据库和SQL 字段类型 是什么样的对应关系啊
6 楼 firefox_1983 2007-10-18  
读取的时候乱码我倒是解决过,写的时候还没有发现过乱码
5 楼 jvincent 2007-10-17  
楼上的为什么一篇文章就50分了?
4 楼 bushunli 2007-10-17  
在java写DBF文件的时候,发现了字段中文写入为乱码,有解决的办法吗,
3 楼 kimfly 2007-08-29  
谢谢了,后来我把他的源码发编译了调试了一下,好像在处理日期为空的时候有问题。暂时还没有处理,如有问题再请你帮忙。
2 楼 viwo 2007-08-28  
kimfly 写道
我用了一样的方法读取dbf文件,但是读取的字段位置有问题。如“博客所有留言会成为论坛回贴”,本来属于一个字段的,但是用jdbfreader解析后就在两个字段里了。下载了个dbfviewer里看是正常的,dbf文件没有问题,请问你遇到过这种情况吗。

目前没有,你可以把你认为读取有问题的DBF文件传上来或者发给我,我可以帮你看看。
1 楼 kimfly 2007-08-28  
我用了一样的方法读取dbf文件,但是读取的字段位置有问题。如“博客所有留言会成为论坛回贴”,本来属于一个字段的,但是用jdbfreader解析后就在两个字段里了。下载了个dbfviewer里看是正常的,dbf文件没有问题,请问你遇到过这种情况吗。

相关推荐

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

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

    java解析dbf之通过javadbf包生成和读取dbf文件

    本文将详细介绍如何使用javadbf库来读取和生成DBF文件。 javadbf是Java的一个第三方库,它提供了一个方便的API来操作DBF文件。这个库允许我们创建、读取和修改DBF文件,从而在Java应用程序中集成对这种格式的支持。...

    java读取shp文件代码

    本文将基于提供的代码片段,详细介绍如何使用Java语言来读取Shapefile文件中的几何信息以及DBF文件中的属性数据。 #### Java读取Shapefile文件的基础知识 1. **Shapefile的基本结构**: - **.shp文件**:包含几何...

    Java读写xml java 读写xml文件操作, 简单易懂

    ### Java读写XML文件操作详解 在现代软件开发中,XML(可扩展标记语言)是一种广泛使用的数据交换格式,尤其在处理配置文件、数据存储以及跨平台数据交换时显得尤为重要。Java提供了多种读写XML文件的方法,包括SAX...

    常用工具包_DBF解析_20080304.rar

    3. **编程语言支持**:许多编程语言如Python、Java、C#、VB.NET等都有库或模块支持处理DBF文件,例如Python的`dbf`库,Java的`jdbf`库等。这些库通常提供了读取、写入和查询DBF文件的API。 4. **DBF工具**:除了...

    XML的读写(简单)

    在这个例子中,我们首先读取名为"input.xml"的文件,然后查找所有名为"nodeName"的元素,将其文本内容替换为"新值",最后将修改后的文档保存到"output.xml"。 此外,JAXB(Java Architecture for XML Binding)是另...

    2021-2022计算机二级等级考试试题及答案No.5531.docx

    - 文件打开模式:以二进制模式打开一个既可读又可写的文件,应使用B. `"wb+"`。 5. 需求分析文档: - 需求文档:在软件开发的需求分析阶段,主要产出文档是D.软件需求规格说明书。 6. 用户界面组件: - 容器类...

    彩虹UDA软件狗工具带硬复制工具

    如果您仍旧使用原有的 DI/DJ/DK 驱动程序、模块及工具,在 DOS 、 Windows 9X/NT/2000 下对 RC-DL 只能做读操作,写操作将失败。如果您不想改动已发行的软件,而还要使用 RC-DL 型软件狗,只升级驱动程序也可以,但...

    2021-2022计算机二级等级考试试题及答案No.365.docx

    12. 文件打开模式:在编程中,`Input`模式打开的文件只能读,不能写。 13. SUM命令计算:在Visual FoxPro中,SUM命令计算所有记录的指定字段的和,如果没有指定范围,则计算全部记录。 14. 局域网定义:LAN(Local...

    2021-2022计算机二级等级考试试题及答案No.12377.docx

    17. **创建数据库后的文件扩展名**通常包括数据库文件(.DBC)、数据表文件(.DBF)和数据表描述文件(.DCT)。 18. **递归调用的存储分配**通常在栈中进行,因为递归调用涉及到函数调用的嵌套,栈可以很好地支持...

    2021-2022计算机二级等级考试试题及答案No.18336.docx

    23. 数据库文件扩展名:DBF通常是数据库文件的扩展名。 24. 强制声明变量:Option Explicit语句用于强制在VB中声明所有变量。 25. 冯·诺依曼原理:不是唯一的计算机工作原理,但它是现代计算机的基础。 26. ...

    2021-2022计算机二级等级考试试题及答案No.15810.docx

    随机访问存储器(RAM)是一种可读可写的内存类型,其特点是断电后数据会丢失。RAM分为动态RAM(DRAM)和静态RAM(SRAM)。正确答案为:正确 ### 变量作用域 在命令窗口中直接定义的变量,默认为全局变量。这意味着...

    2021-2022计算机二级等级考试试题及答案No.13928.docx

    25. **BufferedReader类**:Java中,使用BufferedReader类读取文件,通常需要指定文件路径和文件编码。 以上就是计算机二级考试中涉及的关键知识点,包括编程语言的基本概念、程序设计原则、操作系统交互、网络基础...

    2021-2022计算机二级等级考试试题及答案No.16487.docx

    18. 在DBF(dBASE)文件中,备注型字段的值存储在单独的备注文件中,但题目并未涉及是否需要排序或建立索引,答案D正确。 19. 层次模型、网络模型和关系模型是三种基本的数据模型,答案A正确。 20. 数据库管理系统...

    2021-2022计算机二级等级考试试题及答案No.10675.docx

    5. Visual FoxPro操作:使用MODIFY STRUCTURE命令可以统计表文件(.DBF)中的记录数。 6. 线程优先级:线程的优先级用于调度,数值越大,优先级越高,10代表最高,1代表最低。 7. 算法的有穷性:算法必须在有限...

    2021-2022计算机二级等级考试试题及答案No.15322.docx

    11. 随机存储器(RAM):RAM是既可以读也可以写的存储器,不是只读不写的。 12. Access2003特点:Access的界面与Office系列软件一致,它可以作为个人计算机和大型主机系统之间的桥梁,适用于各种用户,但它不能直接...

    oracle命令大全.pdf

    - `create tablespace test datafile 'd:\oracle\binbo.dbf' size 10m`:创建名为test的表空间,并指定一个10MB大小的数据文件。 - `create user 用户名 identified by 用户名`:创建新用户,并设置其密码。 6. *...

    2021-2022计算机二级等级考试试题及答案No.19602.docx

    4. 顺序文件的打开方式中,Random不是一种,通常包括Input(读)、Output(写)和Append(追加)模式。 5. 微机系统常见的打印机类型包括机械式、喷墨式和激光式。 6. Alt+PrintScreen键可以将当前活动窗口的图像...

    2021-2022计算机二级等级考试试题及答案No.12902.docx

    18. **Java读文件并记录行号**:Java中`LineNumberReader`类继承自`BufferedReader`,可以通过`setLineNumber(int)`和`getLineNumber()`方法设置和获取当前行号。 19. **计算机工作原理**:在计算机工作过程中,...

Global site tag (gtag.js) - Google Analytics