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为观众播放高清低延时的 ...
随机推荐
- tensorflow Tensorboard可视化-【老鱼学tensorflow】
tensorflow自带了可视化的工具:Tensorboard.有了这个可视化工具,可以让我们在调整各项参数时有了可视化的依据. 本次我们先用Tensorboard来可视化Tensorflow的结构. ...
- 小游戏canvas直接操作ImgaeData时的几个优化点
前不久在处理一个canvas绘图需求时,经过不断测试优化,将重绘一帧的时间由400ms降低至20ms左右,基本满足了要求.特此记录一下优化方向. 设备环境:Android,360*720,pixelR ...
- PhpStorm代码提示(省电模式)的设置与使用
PhpStorm中有个,Power Save Mode(省电模式),开启则代码不能自动提示,关闭则可以. 开启/关闭: 1.点击“File”菜单,最下面,Power Save Mode,勾选或取消: ...
- Linux:从入门到放弃
[未解决] # 周五,安装ubuntu 18.04 # 周六,相继安装minit / deepin 系统. # 至今,遇到过还没有解决的问题有: # . 开机ACPI Error: # . 无论哪个L ...
- 如何从Eclipse导入github上的项目源码--转载
[转载出处声明:hil2000的专栏] 1.首先在github.com上申请一个账号,比如笔者的账号为puma0072.Eclipse需要安装egit插件,在Eclipse中选择help->Ma ...
- 类中被final修饰的成员变量需要初始化
类中被final修饰的成员变量需要初始化,否则编译不通过,因为final修饰后不能再赋值,因此必须初始化.
- (转)Jquery获取上级、下级或者同级的元素
下面介绍JQUERY的父,子,兄弟节点查找方法 jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$(&qu ...
- 安装es6编译babel
1.它的安装命令如下. 全局安装 :$ npm install --global babel-cli项目下安装: $ npm install -g babel-cli --save-dev 2.配置. ...
- Java中的异步通知
在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了". 程序是自上而下顺序执行 ...
- 一个for实现9*9乘法表
今天看到别人一个博客提出来一个非常有趣的题目,写一个9*9的乘法表,要求只使用且仅使用一个for来实现9*9乘法表的打印.(不使用if,switch,?:) 可以用任何语言实现,下面是博主给的ja ...