dbf文件读与写

DBF是dBase和FoxPro软件的数据表文件
maven依赖

<!-- https://mvnrepository.com/artifact/com.github.albfernandez/javadbf -->
<dependency>
    <groupId>com.github.albfernandez</groupId>
    <artifactId>javadbf</artifactId>
    <version>1.9.4</version>
</dependency>

dbf文件读取:

 /**
     * 读取dbf文件内容
     * @param path dbf文件路径 + 名称
     * @return
     */
    public static List<Map<String, String>> readDBF(String path) {
        List<Map<String, String>> result = new ArrayList<>();
        InputStream fis = null;
        try {
            fis = new FileInputStream(path);
            DBFReader reader = new DBFReader(fis);
            // 处理中文乱码
            reader.setCharactersetName("GBK");
            Object[] rowValues;
            // 一条条取出path文件中记录
            while ((rowValues = reader.nextRecord()) != null) {
                int j = 0;
                Map<String, String> map = new HashMap<>();
                for (int i = 0; i < rowValues.length; i++) {
                    DBFField field = reader.getField(j);
                    log.info("字段名称[{}],数据[{}]", field.getName(), rowValues[i]);
                    map.put(field.getName(), rowValues[i] + "");
                    j++;
                }
                result.add(map);
            }
            log.info(JSON.toJSONString(result));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

dbf文件的写入:

/**
     * 生成dbf文件
     * @param dbfFilePath [{"filedName":"xxx","length":"xx"},{"filedName":"xxx","length":"xx"}]
     * @param filedList 数据  数据格式:[[xx,xx,...],[xx,xx,...]]
     * @param dataList
     */
    public static void writeDbfFile(String dbfFilePath, List<Dbf> filedList, List<List<String>> dataList) {
        if (filedList == null) {
            log.info("filedList不能为空");
            return;
        }
        if ("dbf".equals(dbfFilePath.lastIndexOf("."))) {
            throw new BusinessException("文件后缀有误");
        }
        OutputStream fos = null;
        DBFField fields[] = new DBFField[filedList.size()];
        for (int i = 0; i < filedList.size(); i++) {
            Dbf dbf = filedList.get(i);
            fields[i] = new DBFField();
            fields[i].setName(dbf.getFiledName());
            fields[i].setType(DBFDataType.CHARACTER);
            // 这里必须定义,指明长度
            fields[i].setLength(dbf.getLength());
        }

        try {
            DBFWriter writer = new DBFWriter();
            writer.setFields(fields);

            if (dataList != null && !dataList.isEmpty()) {
                dataList.forEach(data -> {
                    Object[] rowData = new Object[dataList.size()];
                    for (int i = 0; i < data.size(); i++) {
                        rowData[i] = data.get(i);
                    }
                    writer.addRecord(rowData);
                });
            }
            fos = new FileOutputStream(dbfFilePath);
            // 解决中文乱码
            writer.setCharactersetName("GBK");
            // 写入数据
            writer.write(fos);
            log.info("dbf[{}]文件生成完成", dbfFilePath);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

我的这两个方法都是写在dbfUtil类中,在这个类中我又写了一个内部类:

@Data
public static class Dbf{
     /** 字段名称 */
     private String filedName;
     /** 字段长度 */
     private int length;
 }

整理不易,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值