厦门Java培训
达内上海中山公园中心

13429669395

热门课程

java把dbf文件写入远程服务器的步骤

  • 时间:2015-11-19
  • 发布:厦门达内
  • 来源:达内培训


    达内java培训专家表示,把dbf写入到远程服务器上,需要封装好的jar包。

    首先,Java读写Windows共享文件夹:

    1、下载JCIFS

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

    2、设置共享文件夹,需要设置用户名密码

    3、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);
        }

    }

    然后,“smbFile.connect(); //尝试连接”这段代码过于花费时间,行情的dbf库实时刷新,怎样才能更好呢?

    1、项目启动时初始化好远程连接

    写一个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);

    2、模块化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();
            }           

3、行情来时,写进去

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


   
上一篇:java实现单例方法的对比
下一篇:Java 多线程处理任务的封装处理

达内教育蝉联荣登“2016百度数字资产榜单”职业教育类第一名

795万高校毕业生创历史新高,2017届毕业生就业近况几何?

恭喜达内获得《产学合作协同育人项目合作伙伴奖》

达内Java大数据捷报频传,最高薪资15000元

选择城市和中心
贵州省

广西省

海南省