首页 > 编程语言 >java 实现 dbf 操作

java 实现 dbf 操作

时间:2023-04-04 10:45:25浏览次数:49  
标签:java String import dbf new 操作 dbfReader charsetName

      
<-- 依赖 dbf->
    <dependency> <groupId>com.github.albfernandez</groupId> <artifactId>javadbf</artifactId> <version>1.13.2</version> </dependency>
package com.thtf.zwdsj.fangjia.utils;

import com.linuxense.javadbf.DBFDataType;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFReader;
import com.linuxense.javadbf.DBFWriter;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * @创建人 qinyangyang
 * @创建时间 2023/02/27
 * @描述
 */
public class DbfWriterAndReadUtil {

    /**
     * 创建dbf空文件,
     * @param path:文件路径
     * @param fieldList:dbf字段,需要设定name,type,length这些参数,可以参考从标准dbf文件中读取出来的样式。
     * @param charsetName 编码字符集
     * @throws IOException
     */
    public static void createDbf(String path, List<Map<String, String>> fieldList, String charsetName)
            throws IOException {
        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 = new DBFWriter(new FileOutputStream(path), Charset.forName(charsetName));
        //设置字段
        dbfWriter.setFields(fields);
        //写入dbf文件并关闭
        dbfWriter.close();
    }


    /**
     * 获取字段名
     * @param path
     * @param charsetName
     * @return
     * @throws IOException
     */
    public static String[] getFieldName(String path, String charsetName) throws IOException {
//        InputStream fis = new FileInputStream(path);
        DBFReader dbfReader = new DBFReader(new FileInputStream(path), Charset.forName(charsetName));

        int fieldCount = dbfReader.getFieldCount();//获取字段数量
        String[] fieldName = new String[fieldCount];
        for (int i = 0; i < fieldCount; i++) {
            fieldName[i] = dbfReader.getField(i).getName();
        }
        dbfReader.close();
//        fis.close();
        return fieldName;
    }


    /**
     * 使用读取dbf文件作为模板,写dbf文件
     * @param pathRead:dbf文件头模板
     * @param pathWriter:dbf写文件路径
     * @param rowList:要写入的记录行
     * @param charsetName:字符集
     * @throws IOException
     */
    public static void writeDbf(String pathRead, String pathWriter, List<Map<String, Object>> rowList, String charsetName)
            throws IOException {

        DBFReader dbfReader = new DBFReader(new FileInputStream(pathRead), Charset.forName(charsetName));
        //获取字段数量
        int fieldCount = dbfReader.getFieldCount();

        DBFField[] fields = new DBFField[fieldCount];

        for (int i = 0; i < fieldCount; i++) {

            fields[i] = dbfReader.getField(i);
        }
        File fileWriter = new File(pathWriter);

        DBFWriter dbfWriter = new DBFWriter(fileWriter, Charset.forName(charsetName));
        //需要先设置好fileds,本方法fields与读取的dbf文件相同,所以直接从读取dbf文件拿。

        //如果文件不存在,需要设置dbf文件字段头
        if(!fileWriter.exists()){
            dbfWriter.setFields(fields);
        }

        //获取字段
        String[] fieldName = getFieldName(pathRead, "GBK");

        for (Map<String, Object> rowMap : rowList) {
            Object[] rowData = new Object[fieldName.length];
            for (int i = 0; i < rowData.length; i++) {
                //根据字段来排列指,不然可能出现错位情况
                rowData[i] = rowMap.get(fieldName[i]);
            }
//            rowMap.values().toArray(rowData);
            //添加记录(此时并没有写入文件)
            dbfWriter.addRecord(rowData);
        }

        //写入dbf文件并保存关闭
        dbfWriter.close();
    }

    /**
     * 读dbf记录
     * @param path
     * @return
     * @throws IOException
     */
    public static List<Map<String, Object>> readDbf(String path, String charsetName) throws IOException {
        List<Map<String, Object>> rowList = new ArrayList<>();
//        InputStream fis = new FileInputStream(path);
        DBFReader dbfReader = new DBFReader(new FileInputStream(path), Charset.forName(charsetName));
        Object[] rowValues;
        while ((rowValues = dbfReader.nextRecord()) != null) {
            Map<String, Object> rowMap = new HashMap<String, Object>();
            for (int i = 0; i < rowValues.length; i++) {
                if(rowValues[i] != null && !rowValues[i].equals("")){
                    rowMap.put(dbfReader.getField(i).getName(),rowValues[i]);
                }
            }
            if(!rowMap.isEmpty()){
                rowList.add(rowMap);
            }
        }
        dbfReader.close();
//        fis.close();
        return rowList;
    }


    /**
     * 读dbf记录
     * @param file
     * @return
     * @throws IOException
     */
    public static List<Map<String, Object>> readDbf(MultipartFile file,String charsetName) throws IOException {
        List<Map<String, Object>> rowList = new ArrayList<>();
//        InputStream fis = new FileInputStream(path);
        DBFReader dbfReader = new DBFReader(file.getInputStream(), Charset.forName(charsetName));
        Object[] rowValues;
        while ((rowValues = dbfReader.nextRecord()) != null) {
            Map<String, Object> rowMap = new HashMap<String, Object>();
            for (int i = 0; i < rowValues.length; i++) {
                if(rowValues[i] != null && !rowValues[i].equals("")){
                    rowMap.put(dbfReader.getField(i).getName(),rowValues[i]);
                }
            }
            if(!rowMap.isEmpty()){
                rowList.add(rowMap);
            }
        }
        dbfReader.close();
//        fis.close();
        return rowList;
    }
}

 

标签:java,String,import,dbf,new,操作,dbfReader,charsetName
From: https://www.cnblogs.com/chenTo/p/17285611.html

相关文章

  • IDEA:如何导入maven项目,以及启动项目,关闭项目等操作
    导入Maven项目操作一:导入项目(情况一)IDEA没有打开过其他项目打开IDEA,选择Open,找到项目位置,选择项目根目录(情况二)IDEA已经打开过其他的项目打开IDEA,选择file,选择open,找到项目位置,选择项目根目录         其他操作上述两种情况均......
  • 提高消费速度的几种操作
    https://blog.csdn.net/yanluandai1985/article/details/122317238 第二部分:提高消费速度的几种操作    kakfa是我们在项目开发中经常使用的消息中间件。由于它的写性能非常高,因此,经常会碰到Kafka消息队列拥堵的情况。遇到这种情况时,有时我们不能直接清理整个topic,因......
  • 操作系统-文件结构划分
    1.文件的逻辑结构(文件内部的逻辑结构)索引文件索引顺序文件2.文件目录结构(文件外部的逻辑结构:文件与文件之间的逻辑结构)FCB和索引节点的关系是怎样的在检索目录文件的过程中,只用到了文件名,文件的其他描述信息用不到,也不需要调入内存,所以文件描述信息就形成了一个叫索引结......
  • Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
    如何阻止JavaSpringBootTest单元测试中包括多线程时,没跑完就结束了使用CountDownLatchCountDownLatch、CyclicBarrier使用区别多线程ThreadPoolTaskExecutor应用JavaBasePooledObjectFactory对象池化技术@SpringBootTestpublicclassPoolTest{@Test......
  • java笔记(this,super,override,instanceof,static)
    super关键字的一些注意事项子类在执行构造方法时,如果显式使用super()显式调用父类构造方法,则该调用必须放代码块在第一行super必须出现在子类的方法或者构造方法中使用this()显示调用构造方法,则该调用必须放在代码块第一行由于第一条和第三条限制,super和this不能同时调用构造......
  • 【Java 并发】【八】【Atomic】【二】AtomicInteger、AtomicBoolean原理
    1 前言这节我们从AtomicInteger这个比较简单的原子类开始,来看看AtomicInteger的底层原理。2  实测样例对比线程安全性在说AtomicInteger的底层原理之前呢,我们先来看个例子感受下原子类:static修饰的共享变量,我们开启两个线程对共享变量进行10000次+1的操作2.1  Integer......
  • 如何用java校验SQL语句的合法性?(提供五种解决方案)
    方案一:使用JDBCAPI中提供的Statement接口的execute()方法要在Java中校验SQL语句的合法性,可以使用JDBCAPI中提供的Statement接口的execute()方法。这个方法会尝试执行给定的SQL语句,如果SQL语句不合法,则会抛出一个SQLException异常。因此,我们可以利用这个异常来判断SQL语句的合法......
  • java学习日记20230404-String类
    String类String对象用于保存字符串,也就是一组字符序列;字符串常量对象使用双引号包括起来的字符序列字符串的字符使用unicode字符编码,一个字符(不区分字母还是汉字)占用两个字节String常用的构造器:newString();newString(Stringoriginal);newString(char[]a);newString(char[]......
  • Django笔记十五之in查询及date日期相关过滤操作
    这一篇介绍关于范围,日期的筛选inrangedateyearweekweekdayquarterhour1、inin对应于MySQL中的in操作,可以接受数组、元组等类型数据作为参数:Blog.objects.filter(id__in=[1,2,3])对应的SQL是:select*fromblog_blogwhereidin(1,2,3);字符串也可以作......
  • 更改我们在Javaweb的运行启动方式
    之前之前,我都是利用上面的Tomcat的三角符号进行启动的更改1、下载插件在idea界面的右上角的设置按钮,选中其中的Plugins选项:然后会弹出一个界面,选中右上方的Marketplace,然后在下面的搜索框里面搜索MavenHelper:下载它,然后重启IDEA2、使用插件运行web右键项目名称,选中其中......