Java dbf文件写入远程服务器

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/49886999 重要的事情说三遍,有木有,J...
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/49886999

重要的事情说三遍,有木有,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写入进行封装,更灵活的应对远程写入还是本地写入,最后呢,行情刷新时能够启动线程写入,而不影响当前线程的性能。王二的编程能力很一般,虽然他老是不承认,没办法,谁让我就是王二呢?!


相关文章

王二语录

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

相关文章
|
12天前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1天前
|
Java Linux 定位技术
Minecraft配置文件参数说明(JAVA服务器篇)
Minecraft JAVA版服务器启动后会生成server.properties配置文件,位于minecraft_server/根目录下。该文件包含多项关键设置,如游戏模式(gamemode)、最大玩家数(max-players)、难度(difficulty)等。此文档详细说明了各配置项的功能与默认值,帮助用户高效管理服务器环境。
27 2
|
1月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
34 4
|
1月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
3月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
422 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
2月前
|
存储 安全 网络安全
服务器感染了.baxia勒索病毒,如何确保数据文件完整恢复?
近年来,勒索病毒如.baxia不断演变,利用漏洞、社交工程等手段加密文件,威胁范围扩大。加密货币的兴起使其支付方式更匿名,追踪困难。技术支持尤为重要,添加技术服务号(shuju315),专业团队提供数据恢复方案。面对复杂解密要求,包括赎金支付、个人信息提供和执行特定操作,需保持冷静并寻求帮助。防御措施包括加强安全意识、定期备份数据、安装杀毒软件、避免未知文件、更新系统及制定应急响应计划。
97 11
|
3月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
136 34
|
2月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
63 0
|
7天前
|
域名解析 人工智能 弹性计算
DeepSeek服务器繁忙解决方法:使用阿里云一键部署DeepSeek个人网站!
通过阿里云一键部署DeepSeek个人网站,解决服务器繁忙问题。学生用户可领取300元代金券实现0成本部署,普通用户则可用99元/年的服务器。教程涵盖从选择套餐、设置密码到获取百炼API-KEY的全流程,助您快速搭建专属大模型主页,体验DeepSeek、Qwen-max、Llama等多款模型,无需代码,最快5分钟完成部署。支持绑定个人域名,共享亲友使用,日均成本仅约1元。
63 10
|
17天前
|
弹性计算 运维 监控
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
本文介绍了如何通过阿里云获取ECS云服务器并进行操作系统配置与组件安装,以实现高效的资源管理和系统监控。阿里云凭借强大的基础设施和丰富的服务成为用户首选。文中详细描述了获取ECS、RAM授权、开通操作系统控制台及组件安装的步骤,并展示了如何利用控制台实时监控性能指标、诊断系统问题及优化性能。特别针对idle进程进行了深入分析,提出了优化建议。最后,建议定期进行系统健康检查,并希望阿里云能推出更友好的低成本套餐,满足学生等群体的需求。
83 17
【阿里云】控制台使用指南:从创建ECS到系统诊断测评