JavaDBF:保存行情实时数据到DBF文件
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文件的更多相关文章
- Linux中Matlab保存多个数据到同一个文件当中
% load pyrim % NumTrain = 50; % load machine %NumTrain = 150; % load housing % NumTrain = 300; % loa ...
- Java读取Level-1行情dbf文件极致优化(1)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- delphi 2010 导出sql server 数据到DBF乱码问题
近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...
- xls/csv文件转换成dbf文件
转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...
- Java读取Level-1行情dbf文件极致优化(3)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- Java读取Level-1行情dbf文件极致优化(2)
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...
- matlab结构体形式保存数据生成.mat文件< 转>
2015年 参加天池大数据竞赛 为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVX ...
- MATLAB实例:新建文件夹,保存.mat文件并保存数据到.txt文件中
MATLAB实例:新建文件夹,保存.mat文件并保存数据到.txt文件中 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用MATLAB实现:指定路径下 ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器功能简介---实时数据统计报表、视频文件上传、点播、分享、集成
熟悉EasyDSS流媒体服务器的小伙伴应该都知道,EasyDSS通过将EasyRTMP推流的直播流进行直播转码.智能处理.视频分发,再通过 CDN 分发节点分发到终端播放 SDK为观众播放高清低延时的 ...
随机推荐
- 玩转GET 和 POST
HTTP 基本概念 HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 HTTP Request Methods 不只是 GET 和 ...
- symfony简单的博客练习,熟悉具体开发流程
这里搭建一个简单的博客系统作为练习,之后再完成学校任务搭建一个表白墙, 使用htmlpurifier和parsedown来搭建前端,所以需要先安装这两个第三方包,必须要弄一个composer的国内镜像 ...
- vue v-if 和 v-show 的知识点
1.v-if 的特点: 实现方式:根据后面数据的真假判断是否重新删除或创建元素. 性能消耗:有较高的切换性能消耗. 编译过程:v-if 切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的 ...
- tp5.0.7 修复getshell漏洞
这里 接手项目用的是 tp5.0.7 突然想到前段事件的tp bug 事件 就试了下 发现确实有这种情况 参考帖子: https://bbs.ichunqiu.com/thread-48687-1-1 ...
- 【ABP.Net】1.创建项目&介绍框架结构
既然已经打开这个页面了,我就不介绍什么是ABP了.哈哈哈,如果想知道,请移驾.反正我是不说. 1.首先打开https://aspnetboilerplate.com/Templates 下载所需要的A ...
- “Hello, my first blog”------第一篇博客的仪式感
本人在校大学生一枚,开通博客,主要是想记录自己的学习过程,分享自己的学习经历.记得大一的时候,很多不懂的操作和知识,都是在博客上找到了相应的解决办法.但比较讽刺的是,很多时候,曾经解决了的问题,当再次 ...
- 1.3 正则表达式和python语言-1.3.7 匹配任何单个字符
1.3.7 匹配任何单个字符 (2018-05-08) 点号(.)不能匹配一个换行符\n 或者非字符,也就是说,一个空字符串 搜索一个真正的句点(小数点), 而我们通过使用一个反斜线对句点的功能进行转 ...
- Android SDK提供的常用控件Widget “常用控件”“Android原生”
Android提供一个标准的视图工具箱来帮助创建简单的UI界面.通过使用这些控件(必要时,可以对这些控件进行修改). 创建一个简单的.xml文件,从预览窗口可以看到Android SDK提供的原生控件 ...
- 学习使用Mendeley1
原文来自:https://www.mendeley.com/guides/desktop/01-desktop-interface 1.添加文件菜单 - 使用此功能将新条目添加到您的Mendeley库 ...
- tf.contrib.slim.data数据加载 综述
TF-Slim为了方便加载各种数据类型(如TFRocords或者文本文件)的数据,创建了这个库. Dataset 这里的数据库与通常意义下数据库是不同的,这里数据库是python一个类,它负责将原始数 ...