Java dbf文件写入远程服务器

来源:互联网 发布:怪物猎人p3数据 编辑:程序博客网 时间:2024/05/19 23:53

重要的事情说三遍,有木有,Java dbf文件写入远程服务器,第一遍,第二遍,第三遍…够了,王二,还有完没有,赶紧点

需求

今天早晨,王二(也就是我)接到一个需求:
把行情的dbf库写入到远程windows server2003上!

分析

之前,我就写过一篇Java操作DBF文件数据库 ,但怎么把dbf写入到远程服务器上,这好像需要点什么。

于是我就去问度娘啊,看看有没有什么封装好的jar包之类的,好拿来用用。
折腾了一会关键字,终于找到了一篇Java读写Windows共享文件夹,感谢博主的良苦用心啊,于是为博主点了一个赞。

拿来主义

第一步,下载JCIFS
网址: http://jcifs.samba.org/

把jcifs-1.3.18.jar加入到项目jar包库中。

第二步,设置共享文件夹,当然需要设置用户名密码的
怎样让客户机访问windows2003服务器共享文件

第三步,demo,先探探路通不通

    public static void main(String[] args) {        try {            // 定义DBFWriter实例用来写DBF文件            DBFWriter writer = new DBFWriter();            writer.setCharactersetName("GB2312");            DBFField fields[] = new DBFField[1];            // S1 HQZQDM 证券代码 Char 6            fields[0] = new DBFField();            fields[0].setName("S1");            fields[0].setDataType(DBFField.FIELD_TYPE_C);            fields[0].setFieldLength(6);            writer.setFields(fields);            Object[] obj1 = new Object[1];            obj1[0] = "000001";            writer.addRecord(obj1);            String remoteUrl = "smb://abc:123@127.168.1.11/dbf/PENGBO.dbf";            SmbFile smbFile = new SmbFile(remoteUrl);            smbFile.connect(); //尝试连接              OutputStream fos = new  BufferedOutputStream(smbFile.getOutputStream());            writer.write(fos);            fos.close();        } catch (Exception e) {            logger.error(e.getMessage());            logger.error(e.getMessage(), e);        }    }

注意remoteUrl

  1. smb:,不知道啥意思,应该是一种协议吧?王二,你这么一知半解,不好吧?额,那问问度娘吧

    SMB(Server Message Block)是协议名,它能被用于Wap连接和客户端与服务器之间的信息沟通。

  2. abc:123,你共享权限中指定的用户名和密码

  3. 127.168.1.11,自然是远程ip了
  4. dbf,共享的文件夹
  5. PENGBO.dbf,dbf文件名喽
  6. 第六,也没啥,如果上面5点没有说清楚,那么请私信王二,或者嘛,问度娘,美貌如花,有问必答????

run一下
这里写图片描述

写到这应该算完结了吧,我觉得也是,可是王二偏要说再写点,好吧,我就应了自己吧!

修葺

其实吧,写到上面这里,也确实算完了,无奈王二天生一颗追求完美的心,这面这段代码有点小遗憾,smbFile.connect(); //尝试连接特别花费时间,而行情的dbf库实时刷新,这样肯定不行!

那么需要做的就是,你看下面步骤,我决定放大招:

第一步,项目启动时初始化好远程连接

写一个DBFListener类吧

    private static Logger logger = Logger.getLogger(DBFListener.class);    private SmbFile smbFile = null;    private File file = null;    public void start() {        try {            if (Commonstants.remote_flag_dbf) {//需要远程写dbf                String remoteUrl = "smb://" + Commonstants.username_dbf + ":" + Commonstants.password_dbf + "@"                        + Commonstants.path_info_dbf;                smbFile = new SmbFile(remoteUrl);                smbFile.connect();                logger.info("dbf 远程连接启动成功!");            } else {                file = new File(Commonstants.path_info_dbf);                logger.info("dbf 本地文件创建成功!");            }        } catch (Exception e) {            logger.error(e.getMessage());            logger.error(e.getMessage(), e);        }    }    // 行情变化时,对行情进行写入    public void writeDBF(List<Quotation> dbfQuotations) {        ExecutorService pool = Executors.newSingleThreadExecutor();        pool.execute(new Thread(new DBFThread(smbFile, dbfQuotations, file)));        pool.shutdown();        logger.info("dbf写入线程启动...");    }

项目运行时,尝试连接远程dbf服务器

        logger.info("行情服务器开始连接dbf服务");        int j = 1;        DBFListener dbfListener = new DBFListener();        while (true) {            try {                dbfListener.start();                break;            } catch (Exception e) {                logger.info("5秒后开始尝试第" + (++j) + "次连接dbf服务,发生重连原因:" + e.getMessage());                try {                    Thread.sleep(5000);                } catch (InterruptedException e1) {                    logger.error(e1.getMessage(), e1);                }            }        }        DBFManager.setdbfListener(dbfListener);

第二步,模块化dbf操作
写一个dbf操作类DBFOperation

    public static void writeDBFByQuotation(SmbFile smbFile, List<Quotation> quotaionList, File file) {        try {            // 定义DBFWriter实例用来写DBF文件            DBFWriter writer = new DBFWriter();            writer.setCharactersetName("GB2312");            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);...            if (file!=null) {                FileOutputStream fos = new FileOutputStream(file);                writer.write(fos);                fos.close();            }            if (smbFile != null) {                OutputStream fos = new  BufferedOutputStream(smbFile.getOutputStream());                writer.write(fos);                fos.close();            }           

第三步,行情来时,写进去

        dbfListener.writeDBF(dbfQuotations);        logger.info("写入DBF数据库结束");

这代码没法贴全,只好捡重要的贴出来,权当给一个参考。主要的思路就是,系统初始化就加载好SmbFile对象,然后对dbf写入进行封装,更灵活的应对远程写入还是本地写入,最后呢,行情刷新时能够启动线程写入,而不影响当前线程的性能。王二的编程能力很一般,虽然他老是不承认,没办法,谁让我就是王二呢?!


相关文章

  • Java操作DBF文件数据库

王二语录

那么人生何处不爬虫,爬虫请标http://blog.csdn.net/qing_gee
如果你能心无旁骛,专心致志地做好自己的事,做最好的自己,你就能在不知不觉中超越他人,跨越平庸的鸿沟,脱颖而出!—–写™的真好,可惜不是我王二写的!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五个月的宝宝大便干燥怎么办 婴儿便秘怎么办什么方法最有效 8个月小孩便秘怎么办 1个月新生儿便秘怎么办 新生儿头竖立0分怎么办 20天的宝宝便秘怎么办 出生23天的宝宝便秘怎么办 喝奶粉的宝宝便秘怎么办 抱孩子抱的驼背怎么办 4岁宝宝不拉屎怎么办 小朋友大便拉不出来怎么办 儿童便秘拉不出来怎么办 没感冒喉咙有痰怎么办 宝宝喂不进去药怎么办 新生儿只放屁不拉大便怎么办 新生儿腹胀不拉大便怎么办 8月宝宝咳嗽有痰怎么办 2个月婴儿惊吓怎么办 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办