《Java知识应用》Java读写DBF文件

1. 准备:

Jar包下载:链接: https://pan.baidu.com/s/1Ikxx-vkw5vSDf9SBUQHBCw 提取码: 7h58 复制这段内容后打开百度网盘手机App,操作更方便哦

2. 案例:

import com.linuxense.javadbf.DBFDataType;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFReader;
import com.linuxense.javadbf.DBFWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 读写DBF文件工具类
 */
public class DBFUtils {

    /**
     * 读DBF文件
     * @param path
     * @param charsetName
     * @return
     * @throws IOException
     */
    public static List<Map<String, String>> readDbf(String path, String charsetName) {
        List<Map<String, String>> rowList = new ArrayList<>();
        DBFReader dbfReader = null;
        Object[] rowValues;
        try {
            dbfReader = new DBFReader(new FileInputStream(path), Charset.forName(charsetName));

            while ((rowValues = dbfReader.nextRecord()) != null) {
                Map<String, String> rowMap = new HashMap<>();
                for (int i = 0; i < rowValues.length; i++) {
                    rowMap.put(dbfReader.getField(i).getName(), String.valueOf(rowValues[i]).trim());
                }
                rowList.add(rowMap);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (dbfReader != null){
                dbfReader.close();
            }
        }
        return rowList;
    }

    /**
     * 创建dbf
     * @param path:文件路径
     * @param fieldList:字段
     * @param charsetName 编码字符集
     * @throws IOException
     */
    public static void createDbf(String path, List<Map<String, String>> fieldList, String charsetName){
        DBFField[] fields = new DBFField[fieldList.size()];
        int index = 0;
        for (Map<String, String> fieldMap : fieldList) {
            DBFField field = new DBFField();
            field.setName(fieldMap.get("name"));//字段名称
            field.setType(DBFDataType.CHARACTER);//指定字段类型为字符串
            field.setLength(Integer.valueOf(fieldMap.get("length")));//指定长度
            fields[index] = field;
            index++;
        }
        //定义DBFWriter实例用来写DBF文件
        DBFWriter dbfWriter = null;
        try {
            dbfWriter = new DBFWriter(new FileOutputStream(path), Charset.forName(charsetName));
            //设置字段
            dbfWriter.setFields(fields);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            //写入dbf文件并关闭
            if(dbfWriter != null){
                dbfWriter.close();
            }
        }

    }

    /**
     * 获取字段名
     * @param path
     * @param charsetName
     * @return
     * @throws IOException
     */
    public static String[] getFieldName(String path, String charsetName){
        DBFReader dbfReader = null;
        String[] fieldName = null;
        try {
            dbfReader = new DBFReader(new FileInputStream(path), Charset.forName(charsetName));
            int fieldCount = dbfReader.getFieldCount();//获取字段数量
            fieldName = new String[fieldCount];
            for (int i = 0; i < fieldCount; i++) {
                fieldName[i] = dbfReader.getField(i).getName();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (dbfReader != null){
                dbfReader.close();
            }
        }
        return fieldName;
    }

    /**
     * 写dbf文件
     * @param path:dbf文件路径
     * @param rowList:要写入的记录行
     * @param charsetName:字符集
     * @throws IOException
     */
    public static void writeDbf(String path, List<Map<String, String>> rowList, String charsetName) {
        DBFWriter dbfWriter = new DBFWriter(new File(path));
        //获取字段
        String[] fieldName = getFieldName(path, "GBK");
        for (Map<String, String> rowMap : rowList) {
            Object[] rowData = new Object[fieldName.length];
            for (int i = 0; i < rowData.length; i++) {
                //根据字段来排列指,不然可能出现错位情况
                rowData[i] = rowMap.get(fieldName[i]);
            }
            //添加记录(此时并没有写入文件)
            dbfWriter.addRecord(rowData);
        }
        //写入dbf文件并保存关闭
        dbfWriter.close();
    }

    public static void main(String[] args) {
        List<Map<String, String>> mapList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("name","A10");
        map.put("length","18");
        mapList.add(map);
        //创建文件
        createDbf("src\\demo\\knowledgepoints\\dbf\\1.DBF",mapList,"GBK");

        mapList.clear();
        map = new HashMap<>();
        map.put("A10","蕾蕾");
        mapList.add(map);
        //写文件
        writeDbf("src\\demo\\knowledgepoints\\dbf\\1.DBF",mapList,"GBK");

        //读取
        mapList = readDbf("src\\demo\\knowledgepoints\\dbf\\1.DBF","GBK");
        System.out.println(mapList);
    }
}

运行结果:

文件也在对应位置:

参考:https://blog.csdn.net/u010689849/article/details/90340745

原文地址:https://www.cnblogs.com/jssj/p/12047965.html

时间: 2024-10-07 02:56:10

《Java知识应用》Java读写DBF文件的相关文章

python读写dbf文件

Python读写dbf文件 # coding=utf8 """ A reader and writer for dbf file.see http://code.activestate.com/recipes/362715/ for moe detail """ import struct import datetime import decimal import itertools def dbfreader(f):     "&qu

Java知识整理--Java的List用法

list中可以添加任何对象,举例: class Node { ..... } 上面定义了一个Node类,下面使用List Node n1 = new Node(); Node n2 = new Node(); List list=new ArrayList(); list.add(n1); list.add(n2); //这里是将对象加入到list中 for(int i=0;i<list.size();i++){//利用循环,将Node对象全部一一取出 Node n = (Node)list.g

net core封装DBF文件处理

前言 在.net core项目中需要读写dbf文件,可以使用FastDBF操作dbf文件,十分方便,使用Nuget可以添加FastDBF 代码实现 1 public class DBFUtil 2 { 3 private static List<KeyValuePair<string, PropertyInfo>> Mapping<T>() where T : class 4 { 5 Type type = typeof(T); 6 var properties = t

Java读取Level-1行情dbf文件极致优化(2)

最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1行情没有Level-2快,但是作为系统支持的行情源,我们还是需要优化它,使得从文件读取,到用户通过socket收到行情,端到端的时延尽可能的低.本文主要介绍对level-1行情dbf文件读取的极致优化方案.相信对其他的dbf文件读取应该也有借鉴意义. Level-1行情是由行情小站,定时每隔几秒把d

java把dbf文件写入远程2003服务器

重要的事情说三遍,有木有,java把dbf文件写入远程2003服务器,第一遍,第二遍,第三遍-够了,王二,还有完没有,赶紧点 需求 今天早晨,王二(也就是我)接到一个需求: 把行情的dbf库写入到远程windows server2003上! 分析 之前,我就写过一篇Java操作DBF文件数据库,但怎么把dbf写入到远程服务器上,这好像需要点什么. 于是我就去问度娘啊,看看有没有什么封装好的jar包之类的,好拿来用用. 折腾了一会关键字,终于找到了一篇Java读写Windows共享文件夹,感谢博主

java开发知识IO知识之输入输出流以及文件

java开发知识IO知识之输入输出流以及文件 一丶流概述 流十一组有序的数据序列.根据操作的类型,可以分为输入流跟输出流两种. IO(input/output)输入/输出流提供了一条通道程序.可以使用这条通道把源的字节序列送到目的地 简单来说. 就是操作二进制. 二进制提供了读写功能. 写就是输出. 读就是输入. 输入输出流图示: 输入流讲解 InputStream类. 1. 输入流以及类层次结构 输入流就是从"文件" 读取到内存. 这个文件是抽象的.意思就是不管什么内容从硬盘也好.任

java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高.NIO最主要的就是实现了对异步操作的支持.其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey

Java读取Level-1行情dbf文件极致优化(3)

最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1行情没有Level-2快,但是作为系统支持的行情源,我们还是需要优化它,使得从文件读取,到用户通过socket收到行情,端到端的时延尽可能的低.本文主要介绍对level-1行情dbf文件读取的极致优化方案.相信对其他的dbf文件读取应该也有借鉴意义. Level-1行情是由行情小站,定时每隔几秒把d

java解析dbf文件

dbf文件, 不能直接另存为excel文件, 会丢数据! 需要将dbf数据存储到数据库中, 在从数据库中将数据导出成excel. import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.ArrayList; import java.u