JavaDBF.jar其实很早都不再更新了,在日新月异的科技圈算得上远古上神的jar包,早该身归混沌了。

但我们的项目要用到,因为之前做的大宗期货交易行情的分析文件依然是dbf文件,没有办法,还得用

JavaDBF库把行情实时数据保存到DBF文件中。

第一步,新建DBFManager类

public class DBFManager {
    private static Logger logger = Logger.getLogger(DBFManager.class);

    // 构造一个单线程service,保证调用dbf写入的方法不阻塞
    private static ExecutorService pool = Executors.newSingleThreadExecutor();

    public static void startDbf(List<Quotation> allQuotation) {
        try {
            if (Variables.openDBF) {

                logger.info("写入DBF数据库开始");
                long dt1 = System.currentTimeMillis();

                // 执行线程
                pool.execute(new Thread(new DBFThread(allQuotation)));
                logger.info("写入DBF数据库结束");

                long dt2 = System.currentTimeMillis();
                logger.info("读取行情和写入DBF花费时间:(" + (dt2 - dt1) + ")");
            }
        } catch (Exception e) {
            logger.error("dbf写入错误");
        }
    }

}

在行情推送过来的地方调用

DBFManager.startDbf(quotations);

第二步,新建DBF线程类

public class DBFThread implements Runnable {

    private List<Quotation> quotations;

    /**
     * 传递构造方法.
     *
     * @param quotations
     */
    public DBFThread(List<Quotation> quotations) {
        this.quotations = quotations;
    }

    @Override
    public void run() {
        // 将行情信息写入到dbf文件中
        DBFOperation.writeDBFByQuotation(Variables.path_info_dbf, quotations);

    }

}

第三步,新建DBF操作类

public class DBFOperation {
    private static Logger logger = Logger.getLogger(DBFOperation.class);

    /**
     * 删除文件内容.
     */
    public static void deleteQuotation(String path) {
        File myDelFile = new File(path);
        if (myDelFile.exists()) {
            myDelFile.delete();
        }
    }

    /**
     * 将行情信息添加到文件中
     *
     * @param path
     * @param quotaionList
     * @throws IOException
     */
    public static void writeDBFByQuotation(String path, List<Quotation> quotaionList) {
        FileOutputStream fos = null;
        try {
            DBFField fields[] = new DBFField[30];
            // S1 HQZQDM 证券代码 Char 6
            fields[0] = new DBFField();
            fields[0].setName("S1");
            fields[0].setDataType(DBFField.FIELD_TYPE_C);
            fields[0].setFieldLength(6);

            // S2 HQZQJC 证券名称 Char 8
            fields[1] = new DBFField();
            fields[1].setName("S2");
            fields[1].setDataType(DBFField.FIELD_TYPE_C);
            fields[1].setFieldLength(80);

            // S3 HQZRSP 前收盘价格 Num 8 3
            fields[2] = new DBFField();
            fields[2].setName("S3");
            fields[2].setDataType(DBFField.FIELD_TYPE_N);
            fields[2].setFieldLength(8);
            fields[2].setDecimalCount(3);

            // S4 HQJRKP 今开盘价格 Num 8 3
            fields[3] = new DBFField();
            fields[3].setName("S4");
            fields[3].setDataType(DBFField.FIELD_TYPE_N);
            fields[3].setFieldLength(8);
            fields[3].setDecimalCount(3);

            Object[] obj1 = new Object[4];
            obj1[0] = "000000";
            obj1[1] = "";
            for (int i = 2; i < obj1.length; i++) {
                obj1[i] = Double.parseDouble("0");
            }

            // 定义DBFWriter实例用来写DBF文件
            DBFWriter writer = new DBFWriter();
            // 字符编码设置为GB2312,防止中文乱码
            writer.setCharactersetName("GB2312");
            writer.setFields(fields);
            // 添加纪录,此时未写入到dbf文件,而是在内容中
            writer.addRecord(obj1);

            // Object[] objs = new Object[30];
            for (Quotation quotation : quotaionList) {
                Object[] obj = new Object[4];
                // 证卷代码
                obj[0] = quotation.getScode();
                // 证卷名称

                // 中文乱码解决方法
                Pattern pWord = Pattern.compile("[\u4e00-\u9fa5]");// 校验中文的正则表达式
                String value = quotation.getSname();
                String blank = "";
                if (pWord.matcher(value).find()) {// 如果包含中文就要补够2倍中文字数个空格,否则会导致中文乱码
                    for (int j = 0; j < value.getBytes().length; j++) {
                        blank += "  ";
                    }
                }
                obj[1] = value + blank;
                // 前收盘价
                obj[2] = quotation.getLastPrice().doubleValue();
                // 今开盘价
                obj[3] = quotation.getOpen().doubleValue();

                writer.addRecord(obj);
            }
            fos = new FileOutputStream(path);
            writer.write(fos);

        } catch (IOException e) {
            logger.error("写入DBF出错了" + e.getMessage());
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                logger.error("输出流关闭出错" + e.getMessage());
            }
        }
    }
}

写的操作我已经提供了,但我一直没有找到dbf文件的更新操作,也就是说,假如已存在一行数据,但第二次数据过来时,只需要更新一列,这时候该如何做呢?

JavaDBF:保存行情实时数据到DBF文件的更多相关文章

  1. Linux中Matlab保存多个数据到同一个文件当中

    % load pyrim % NumTrain = 50; % load machine %NumTrain = 150; % load housing % NumTrain = 300; % loa ...

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

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  3. delphi 2010 导出sql server 数据到DBF乱码问题

    近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...

  4. xls/csv文件转换成dbf文件

    转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...

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

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

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

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

  7. matlab结构体形式保存数据生成.mat文件< 转>

    2015年 参加天池大数据竞赛     为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVX ...

  8. MATLAB实例:新建文件夹,保存.mat文件并保存数据到.txt文件中

    MATLAB实例:新建文件夹,保存.mat文件并保存数据到.txt文件中 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用MATLAB实现:指定路径下 ...

  9. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成

    熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...

随机推荐

  1. Mongodb4.0副本集构建

    目前最新的mongodb4.0.2已经支持事务这个重要特性,需要使用的话必须是复制或副本集,这是第一篇先研发如何构建副本集,因为副本集是目前最低成本的高可用群集方式. 1.准备三台服务器,本次使用是的 ...

  2. MDK5 设置project targents?如何实现的有知道的请共享一下谢谢感激不尽!!!!

    就在刚刚阅读NRF51822相关的文档时遇到问题,官方给出了一份模板,我从我安装的example中找出了官方的列程,看到是soft config的方式配置的,于是根据列程的配置,自己新建了一个工程之后 ...

  3. python:PATH、PYTHONPATH 和 sys.path 的区别

    python:PATH.PYTHONPATH 和 sys.path 的区别 共同点 所有在它们的路径里面的 moduel 都可以被 import PATH 在 PATH 中的一些命令,例如 *.exe ...

  4. setOnTouchListener在小米手机中不走ACTION_UP而是走ACTION_CANCEL

    单点触控: MotionEvent.ACTION_DOWN:手指 初次接触到屏幕 时触发. MotionEvent.ACTION_MOVE:手指 在屏幕上滑动 时触发,会多次触发. MotionEve ...

  5. Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins

    本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...

  6. ISP PIPLINE (十一) color correction

    什么是color correction? 为什么要进行color correction? 转换后的色彩饱和度更加明显,更加符合人眼感官. 如何进行color correction? 下图是步骤: 第一 ...

  7. JSPatch 热更新

    JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C/Swift 原生接口. 获得脚本语言的优势,为项目动态添加 ...

  8. 黑洞版视频裂变程序【接口版】全新上线,全新UI,支持分享数据统计

    黑洞版视频裂变程序[接口版]全新上线,全新UI,支持分享数据统计!   后台效果   程序统一售价:1899/套(包安装,包更新) 注:本程序不属于之前视频程序的更新版,展现形式和广告位设置均不同,是 ...

  9. 学习使用Mendeley1

    原文来自:https://www.mendeley.com/guides/desktop/01-desktop-interface 1.添加文件菜单 - 使用此功能将新条目添加到您的Mendeley库 ...

  10. 基础java中的package的命名规则和import的使用

    包的命名一般用公司域名但是注意域名后辍要放前面如下 package com.cnblogs.i.Cat//对应地址是com/cnblos/i/cat.class也就是Cat.class的地址 如果想将 ...