java对DBF的Memo字段操作

原创 2007年09月23日 22:57:00

最近做一个DBF数据导入,下载了javadbf-0.4.0.jar包,发现少了对memo字段读入的支持,决定对这个包的DBFReader类进行扩展,实现对memo字段的读入。

memo字段的存储格式:

/*备注头记录  
   
   字节偏移   说明    
   00   -   03   下一个自由块的位置1    
   04   –   05   未使用    
   06   –   07   块大小(每个块的字节数)1    
   08   –   511   未使用    
   1   存储整数时,高位字节在前。    
    
    
   备注块标头与备注文本  
    
   字节偏移   说明    
   00   –   03   块签名   1   (指示块中数据的类型)  
   0   –   图片(图片字段类型)  
   1   –   文本(备注字段类型)    
   04   –   07   备注长度   1   (以字节为单位)    
   08   –   n   备注文本(n   =   长度)    
   1   存储整数时,高位字节在前。     */

构建一个新的构造函数

public DBFReader( InputStream in, InputStream memo) throws DBFException {
  this(in);

// 读入memo内容
  try {
   this.memoInputStream = new DataInputStream(memo);
   this.initMemoInputStream();// 初始化数据流,代码见下面
  } catch (IOException e) {
   throw new DBFException( e.getMessage()); 
  }
 }

private void initMemoInputStream() throws IOException {
  memoInputStream.read(new byte[6]); // 00   -   03   下一个自由块的位置1       04   –   05   未使用
  blockLength = Utils.readHighEndianShort(memoInputStream); //  06   –   07   块大小(每个块的字节数)1
  memoInputStream.read(new byte[504]); // 08   –   511   未使用
 }

 在nextRecord()方法中,

case 'M':
      // TODO Later

这个位置进行memo字段处理,加了如下代码:

case 'M':
      // TODO Later
      // DBF跳过memo字段
      byte b_memoProxy[] = new byte[ this.header.fieldArray[i].getFieldLength()];
      dataInputStream.read( b_memoProxy);
      // 读取FPT字段
      int iType = Utils.readHighEndianInt(memoInputStream);
      if (iType == 1) {
       int iLength = Utils.readHighEndianInt(memoInputStream);// 红色代码为自己添加的函数
       byte b_memo[] = new byte[ iLength];
       memoInputStream.read(b_memo); // 读入的FPT文件内容
       recordObjects[i] = new String( b_memo, characterSetName);
       if (iLength + 8 > blockLength) {
        memoInputStream.read(new byte[blockLength - (iLength + 8) % blockLength]);
       } else {
        memoInputStream.read(new byte[blockLength - 8 - iLength]);
       }
      }
      break;

此时,完成了memo字段的读入,下面附上readHighEndianInt的代码,在Utils类中实现

public static int readHighEndianInt( DataInput in)
 throws IOException {

  int bigEndian = 0;
  for( int shiftBy=24; shiftBy>-1; shiftBy-=8) {

   bigEndian |= (in.readUnsignedByte()&0xff) << shiftBy;
  }

  return bigEndian;
 }

 

public static short readHighEndianShort( DataInput in)
 throws IOException {

  int high = in.readUnsignedByte();
  int low = in.readUnsignedByte() & 0xff;

  return (short )(high << 8 | low);
 }

到此,读入memo工作全部完成。如果按照这种步骤做下来还有问题,需要源代码,请留言。

javadbf 读取dbf文件 支持包括memo的多种类型

下面是读取dbf中各种数据类型,包括memo类型的部分源码 public Comparable[] nextRecord(Comparable[] recordObjects)  throws D...
  • boriswu
  • boriswu
  • 2013年05月23日 17:15
  • 953

javadbf 读取dbf文件 支持包括memo的多种类型

下面是读取dbf中各种数据类型,包括memo类型的部分源码 public Comparable[] nextRecord(Comparable[] recordObjects)  throws D...
  • boriswu
  • boriswu
  • 2013年05月23日 17:15
  • 953

用javadbf从数据库导出数据成dbf文件

前一个星期碰到一个需求,是这样的:  本地系统有一张表,用于存放一种病人文书的记录,类似于一张病人信息登记表,需要将这个一定时间段内的数据,导出成dbf文件 碰到需求的时候,我在像dbf文...
  • benladeng900912
  • benladeng900912
  • 2015年12月03日 23:47
  • 1298

使用java操作dbf文件的方法---JDBF(转载)

转自:文章来源: http://www.jdon.com/jive/thread.jsp?forum=62&thread=12421&message=7420423 ...
  • zyk_001
  • zyk_001
  • 2013年04月22日 22:16
  • 583

c#生成与操作DBF文件(普通类型与Arcgis属性表类型)

c#生成DBF文件,有两种方式,一种是普通的DBF文件,可用Visual Foxpro打开和编辑,但不能用于Arcgis;另一种方法生成的DBF文件,既可用VF打开,又可以作为Arcgis属性表,在A...
  • sl159
  • sl159
  • 2013年03月18日 21:59
  • 4821

用Odbc读取dbf文件可能存在的问题且不易被发现

近几天新建一个项目做测试,
  • johnsany
  • johnsany
  • 2014年05月19日 10:13
  • 1066

【JAVA】读取和写入数据库生成的dbf文件

后缀名为.dbf的文件是来源于数据库,是数据库保存数据的一种方式。在java的开源库中,javadbf开源库,是专门用来读写dbf文件的工具。 【开发环境】 1、java开发工具,jdk-8u131-...
  • qazcxh
  • qazcxh
  • 2017年08月10日 09:35
  • 1006

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

最近的一个项目需要动态生成DBF文件,用到JavaDBF,简单介绍一下官方网站:http://javadbf.sarovar.org/官方英文指南:http://sarovar.org/docman/...
  • xzknet
  • xzknet
  • 2014年01月09日 17:25
  • 10838

SQL2008R2 导出表 成dbf文件,网上很多文档,但是真正能执行生成dbf文件的不多,我整理了一下:

SQL2008R2 导出表 成dbf文件,网上很多文档,但是真正能执行生成dbf文件的不多,我整理了一下: 主要是 执行这个p_exporttb22存储过程...
  • handsome1234
  • handsome1234
  • 2016年07月08日 20:59
  • 2310

Java解析之纠结的DBF文件

http://qindongliang1922.iteye.com/blog/1941485 使用JDBC-ODBC桥接方式读取Access文件,使用Acces 与DBF都需要配置桥接模式,在控制...
  • xyl870419
  • xyl870419
  • 2014年03月11日 14:11
  • 1395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java对DBF的Memo字段操作
举报原因:
原因补充:

(最多只允许输入30个字)