java解析dbf文件

java解析dbf格式时里面数据类型怎么判断

使用JDBC-ODBC桥接方式读取Access文件,使用Acces

与DBF都需要配置桥接模式,在控制面板里,选择管理工具里配置

核心代码如下,

Java代码  

try {

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

con = DriverManager.getConnection(“jdbc:odbc:ss”,  bulidPath, “”);//加载驱动,默认密码,空字符串即可

//System.out.println(“Access连接:”+con);

} catch (Exception e) {

e.printStackTrace();

}

Java代码  

AccessBase ab=new AccessBase();

Connection con=ab.getConnection(“zdbz.mdb”);

String sql=”select * from test”;//查询表

PreparedStatement ps=con.prepareStatement(sql);

ResultSet rs=ps.executeQuery();

//ResultSetMetaData s=rs.getMetaData();

// int i=s.getColumnCount();

//System.out.println(i);

ListExcelEntity list=new ArrayListExcelEntity();

while(rs.next()){

ExcelEntity xml=new ExcelEntity();

xml.setUi(rs.getString(1));

xml.setTi(rs.getString(2));

xml.setTa(rs.getString(3));

xml.setDp(rs.getString(4));

xml.setVi(rs.getString(5));

xml.setIp(rs.getString(6));

xml.setPg(rs.getString(7));

xml.setAb(rs.getString(8));

xml.setKw(rs.getString(9));

xml.setMh(rs.getString(10));

list.add(xml);

}

DAO.addAccess(list);

// System.out.println(i);

rs.close();

ps.close();

con.close();

4,最后在来说一下,比较纠结的DBF的解析,关于这个东西,散仙以前也没用过,现在客户有这种需求,自然得做好,于是乎Google了一把,效果似乎还不错,第一页上基本全是有关于,JAVA解析DBF格式的,当时我还在想,得来全不费工夫,于是,找了一篇,看起来似乎挺靠谱的解析博客,拷贝了其中的代码,拿过来使用,结果报了各种异常,这种方式是用流读取的,然后直接解析流,提取每一行数据,还附带一个jar包,散仙后面会把jar给传上来,我们先看下这种方式的代码:

Java代码  

package com.dbhelper;

import java.io.FileInputStream;

import java.io.InputStream;

import com.hexiong.jdbf.DBFReader;

public class ParseDBF {

public static void main(String[] args) {

readDBF(“C:\\Users\\cuichao\\Desktop\\zdbz\\test.DBF”);

}

public static void readDBF(String path)

{

InputStream fis = null;

try

{

// 读取文件的输入流

fis = new FileInputStream(path);

// 根据输入流初始化一个DBFReader实例,用来读取DBF文件信息

DBFReader reader = new DBFReader(fis);

//DBFReader reader=new DBFReader(“C:\\Users\\cuichao\\Desktop\\zdbz\\test.DBF”);

// System.out.println(reader);

// 调用DBFReader对实例方法得到path文件中字段的个数

int fieldsCount = reader.getFieldCount();

System.out.println(fieldsCount);

Object[] s= reader.nextRecord();

while(reader.nextRecord()!=nullreader.nextRecord().length0){

for(int i=0;ireader.nextRecord().length;i++){

System.out.println(reader.nextRecord()[i]);

}

}

}

catch (Exception e)

{

e.printStackTrace();

}

finally

{

try {

//  fis.close();

} catch (Exception e) {

}

}

}

}

这种流读取的方式,散仙也看了下源码,代码比较繁琐,而且有好多限制不能用,比如说,读取某列的字符长度不能大于8,或者包含某个C或D的字符的不能用,等等。散仙,猜想这个发博客的人,是根据自己的业务定义的,这也不能怪人家,各个业务的需求都不一样,难免会出现这种情况。 下面,我们来看看,最王道,最通用的解析方法, 既然,它是数据库,那么我们为什么不按数据库的方式来搞呢? 用流读取的方式,不通用,而且异常百出,按数据库的方式,解决,才是最完美的方法。

首先配置好的桥接,截图如下

核心代码如下

Java代码  

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//加载驱动

try {

//conn = DriverManager.getConnection(DB_URL);

conn = DriverManager.getConnection(“jdbc:odbc:ss”,”test.dbf”,””);//无密码则空字符串

pstm = conn.prepareStatement(“select * from test”); // 此处的XXB 为DBF数据文件的名字

rs = pstm.executeQuery();

至此,完美解决DBF数据库文件读取。网上的东西,太杂了,所以,我们要理智判断,取其精华,去其糟粕,为我所用。

终于被我找到了!

完全free的: com/ 这个网站主要是做数据库连接中间介的,其中用到了一个他们自己开发的叫做JDBF的项目,该项目就是专门控制dbf文件的,整个包只有30K大小,你们随便用个工具反编译一下就可以看懂里面的代码,很简单,就是按照具体格式处理文件!(注意,不是使用JDBC连接的。)

不过我试了一下,发现只支持三中格式的:foxpro2.x、DBase IV、DBase III。 

大家用得着的话可以去那里下载! 有问题的话可以再来问我。

我发现国外的这类开源网站很多,国内的就少得可怜了!唉!

java如何操作DBF文件?

ml页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。

2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。(示例如下)

%

response.setContentType(fileminitype);

response.setHeader(“Location”,filename);

response.setHeader(“Cache-Control”, “max-age=” + cacheTime);

//filename应该是编码后的(utf-8)

response.setHeader(“Content-Disposition”, “attachment; filename=” + filename);

response.setContentLength(filelength);

OutputStream outputStream = response.getOutputStream();

InputStream inputStream = new FileInputStream(filepath);

byte[] buffer = new byte[1024];

int i = -1;

while ((i = inputStream.read(buffer)) != -1) {

outputStream.write(buffer, 0, i);

}

outputStream.flush();

outputStream.close();

inputStream.close();

outputStream = null;

%

3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。

servlet端示例

public void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

res.setContentType(” text/plain “);

OutputStream outputStream = null;

try {

outputStream = res.getOutputStream();

//把文件路径为srcFile的文件写入outputStream中

popFile(srcFile, outputStream)) ;

} catch (IOException e) {

e.printStackTrace();

}

}

JApplet端示例

URLConnection con;

try {

//url是被调用的SERVLET的网址 如 *.do

con = url.openConnection();

con.setUseCaches(false);

con.setDoInput(true);

con.setDoOutput(true);

con.setRequestProperty(“Content-Type”,

“application/octet-stream”);

InputStream in = con.getInputStream();

ProgressMonitorInputStream pmInputStream = new ProgressMonitorInputStream

(pane, “正在从服务器下载文件内容”, in);

ProgressMonitor pMonitor = pmInputStream.getProgressMonitor();

pMonitor.setMillisToDecideToPopup(3);

pMonitor.setMillisToPopup(3);

//localfilepath本地路径,localstr文件文件夹,filename本地文件名

String localfilepath = localstr + filename ;

//方法saveFilsaveFilee是把输入流pmInputStream写到文件localfilepath中

if(saveFilsaveFilee(localfilepath,pmInputStream)){

openLocalFile(localfilepath);

}

4.顺便把JApplet上传文件的代码也贴上来.

JApplet端示例

URLConnection con;

try {

con = url.openConnection();

//url是被调用的SERVLET的网址 如 *.do

con.setUseCaches(false);

con.setDoInput(true);

con.setDoOutput(true);

con.setRequestProperty(“Content-Type”,”application/octet-stream”);

OutputStream out = con.getOutputStream();

//localfilepath本地路径,localstr文件文件夹,filename本地文件名

String localfilepath = localstr + filename;

//文件getOutputStream是把文件localfilepath写到输出流out中

getOutputStream(localfilepath,out);

InputStream in = con.getInputStream();

return true;

}catch (IOException e) {

System.out.println(“文件上传出错!”);

e.printStackTrace();

}

servlet端代码示例

public void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

res.setContentType(” text/plain “);

InputStream inputStream = null;

try {

inputStream = res.getInputStream();

//把输入流inputStream保存到文件路径为srcFile的文件中

writefile(srcFile, inputStream);

} catch (IOException e) {

e.printStackTrace();

}

} // end service

总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。以及把文件转换成流或把流转换成文件的操作。

java程序如何读取dbf文件? 最好写上代码?

public class Rwdbf {

 public static void readDBF(String path)   

    {   

       InputStream fis = null;

        try 

        {  

            //读取文件的输入流 

            fis  = new FileInputStream(path);

            //根据输入流初始化一个DBFReader实例,用来读取DBF文件信息

            DBFReader reader = new DBFReader(fis);  

            //调用DBFReader对实例方法得到path文件中字段的个数 

            int fieldsCount = reader.getFieldCount();

            System.out.println(“字段数:”+fieldsCount);

            //取出字段信息   

            for( int i=0; ifieldsCount; i++)    

            {   

              DBFField field = reader.getField(i);

              System.out.println(field.getName());

            }   

            Object[] rowValues;   

            //一条条取出path文件中记录   

            while((rowValues = reader.nextRecord()) != null) 

            {   

              for( int i=0; irowValues.length; i++) 

              {   

                System.out.println(rowValues[i]); 

              }   

            }   

          }   

          catch(Exception e)    

          {   

          e.printStackTrace();  

          }  

          finally  

          {   

          try{   

               fis.close(); 

          }catch(Exception e){}  

          } 

    }   

 

 public static void writeDBF(String path)

 {

  OutputStream fos = null;

  try  

  {   

      //定义DBF文件字段   

      DBFField[] fields = new DBFField[3]; 

      //分别定义各个字段信息,setFieldName和setName作用相同, 

      //只是setFieldName已经不建议使用   

      fields[0] = new DBFField();   

      //fields[0].setFieldName(“emp_code”); 

      fields[0].setName(“semp_code”);   

      fields[0].setDataType(DBFField.FIELD_TYPE_C);   

      fields[0].setFieldLength(10);   

      fields[1] = new DBFField();   

      //fields[1].setFieldName(“emp_name”); 

      fields[1].setName(“emp_name”);   

      fields[1].setDataType(DBFField.FIELD_TYPE_C);   

      fields[1].setFieldLength(20);   

      fields[2] = new DBFField();   

      //fields[2].setFieldName(“salary”); 

      fields[2].setName(“salary”);  

      fields[2].setDataType(DBFField.FIELD_TYPE_N);   

      fields[2].setFieldLength(12);   

      fields[2].setDecimalCount(2);   

      //DBFWriter writer = new DBFWriter(new File(path));   

      //定义DBFWriter实例用来写DBF文件   

      DBFWriter writer = new DBFWriter(); 

      //把字段信息写入DBFWriter实例,即定义表结构  

      writer.setFields(fields);   

      //一条条的写入记录   

      Object[] rowData = new Object[3]; 

      rowData[0] = “1000”;   

      rowData[1] = “John”;   

      rowData[2] = new Double(5000.00);

      writer.addRecord(rowData);   

      rowData = new Object[3];  

      rowData[0] = “1001”;  

      rowData[1] = “Lalit”; 

      rowData[2] = new Double(3400.00);   

      writer.addRecord(rowData);   

      rowData = new Object[3];

      rowData[0] = “1002”;   

      rowData[1] = “Rohit”;  

      rowData[2] = new Double(7350.00);  

      writer.addRecord(rowData);   

      //定义输出流,并关联的一个文件   

      fos = new FileOutputStream(path);

      //写入数据   

      writer.write(fos);   

      //writer.write();  

  }catch(Exception e)   

  {   

      e.printStackTrace();   

  }   

  finally  

  {   

      try{   

      fos.close();

      }catch(Exception e){}

  }

 }

 public static void main(String[] args){

  String path =”E:\\tmp\\2\\xx.dbf”;

  try {

   InputStream fis = new FileInputStream(path);

   DBFReader reader = new DBFReader(fis); 

   int fieldsCount = reader.getFieldCount();

            System.out.println(“字段数:”+fieldsCount);

            DBFField[] df = new DBFField[fieldsCount+2];

            for( int i=0; ifieldsCount; i++)    

            {   

              df[i] = reader.getField(i);

              System.out.println(“field”+i+”:”+df[i].getName());

            }

            df[fieldsCount] = new DBFField();

            df[fieldsCount].setName(“add1”);

            df[fieldsCount].setDataType(DBFField.FIELD_TYPE_C);

            df[fieldsCount].setFieldLength(10);

            df[fieldsCount+1] = new DBFField();

            df[fieldsCount+1].setName(“add2”);

            df[fieldsCount+1].setDataType(DBFField.FIELD_TYPE_C);

            df[fieldsCount+1].setFieldLength(10);

            DBFWriter writer = new DBFWriter();

            writer.setFields(df);

            Object[] rowValues;

            Object[] rowValues1 = new Object[fieldsCount+2];

            //一条条取出path文件中记录   

            while((rowValues = reader.nextRecord()) != null) 

            { 

              for(int i=0;ifieldsCount;i++){

               rowValues1[i] = rowValues[i];

              }

              rowValues1[fieldsCount]=”x”;

              rowValues1[fieldsCount+1]=”xx”;

              writer.addRecord(rowValues1);

            } 

            

            path =”E:\\tmp\\2\\test2.dbf”;

            OutputStream fos = new FileOutputStream(path);

          //写入数据   

          writer.write(fos);   

          System.out.println(“OVER”);

            

  } catch (FileNotFoundException | DBFException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

}

详细出处参考:

java解析dbf文件

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 05:38:01
下一篇 2024年3月28日 05:45:10

相关推荐

  • 深入java虚拟机pdf,深入java虚拟机 中村成洋 pdf

    在linux环境下,java怎么实现从word格式转换为pdf格式 //设置当前使用的打印机,我的Adobe Distiller打印机名字为 Adobe PDF wordCom.setProperty( ActivePrinter , new Variant( Adobe PDF ));//设置printout的参数,将word文档打印为postscript…

    2024年5月23日
    4600
  • java截取指定长度字符串,java截取指定字符串之后的

    java中如何截取字符串中的指定一部分 第一个参数是开始截取的字符位置。(从0开始)第二个参数是结束字符的位置+1。(从0开始)indexof函数的作用是查找该字符串中的某个字的位置,并且返回。 int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;split讲解:java.lang.string.split split 方法 将…

    2024年5月23日
    4400
  • java绑定一个端口,java使用端口

    java如何多个service共用一个端口 你如果有多个项目的话,你可以把多个项目放到一个tomcat里面,这样端口相同使用项目名称来进行区分项目。你如果非要使用同一个,你也可以配置不同的域名导向不同的项目。就是访问的域名不同转接到的项目不同。 如果需要同时启动多个程序,要么修改tomcat的配置文件中的监听端口。要么修改jar包程序的监听端口。不能在一台服…

    2024年5月23日
    3600
  • linux给文件写权限,linux怎么给文件权限

    linux宝塔写入权限不足 1、可以使用chmod命令修改权限。语法:chmod [-cfvR] [–help] [–version] mode file…说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 2、通过更改文件权限可以使用c…

    2024年5月23日
    5200
  • java多线程并发编程基础,Java多线程并发执行返回

    电脑培训分享Java并发编程:核心理论 电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。 人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接…

    2024年5月23日
    4700
  • 自学java找工作,自学java找工作需要包装简历吗

    自学java学多久可以找到工作 1、自学Java至少需要一年以上的时间才能达到找工作的水平。报班培训四到六个月的时间就可以找到一份不错的工作。 2、自学Java至少需要一年以上的时间才能达到找工作的水平。 3、如果要想找到一份Java相关的工作,需要至少学习5-6个月时间才能就业。Java开发需要掌握一些基础的编程语言知识,比如掌握面向对象的编程思想、基本的…

    2024年5月23日
    4400
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    5000
  • java左移右移,java 左移

    java位移问题 1、思路:直接用Integer类的bit运算操作。 2、移位操作:左移:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 3、Java 位运算 Java 位运算[转]一,Java 位运算表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的…

    2024年5月23日
    4300
  • java技术规范,java规范性要求

    现在主流的JAVA技术是什么? java最流行开发技术程序员必看 1 、Git Git一直是世界上最受欢迎的Java工具之一,也是Java开发人员最杰出的工具之一。Git是一个开源工具,是-种出色的分布式版本控制解决方案。 (1).Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱和注解。(2).Java面向对象编…

    2024年5月23日
    4100
  • c语言多文件调用,c语言多文件操作

    c语言一个结构体如何在多个源文件里面调用? 在这种方法中,可以先将多个源文件分别编译成目标文件,然后再将它们链接成一个可执行文件。 在头文件里定义结构,例如:typedef struct { int a, b;} S;S s_instance;在其他文件里引用就可以。 创建程序入口点main函数,在main函数中条用其它函数。达到同时运行的母的。如果不这样,…

    2024年5月23日
    4400

发表回复

登录后才能评论



关注微信