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
如果你能心无旁骛,专心致志地做好自己的事,做最好的自己,你就能在不知不觉中超越他人,跨越平庸的鸿沟,脱颖而出!—–写™的真好,可惜不是我王二写的!

相关文章
|
6月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
279 1
|
9月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
2369 0
|
9月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
276 0
|
9月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
276 0
|
9月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
884 17
|
9月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
671 0
|
9月前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
332 17
|
9月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
432 14
|
10月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
658 5
|
10月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
543 0
下一篇
开通oss服务