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();
}
}
}
详细出处参考: