JAVA自动更新程序

Java和Lua的完美结合:实现Java程序的动态扩展和脚本自动升级 Lua是一种轻量级的脚本语言,常用于游戏开发和嵌入式系统中。它与Java不同,Lua不支持多线程和原生GUI编程。因此,在一些场景下,我们需要将Java和Lua结合起来使用,以弥补两者的不足。本篇博文将介绍如何在Java程序中使用Lua代码,并且在Lua中调用Java代码。 阅读详情

最近由于一个工程需要做应用程序启动时,自动更新的项目
在GOOGLE上找了半天也没见到什么比较好的办法
自己动手写了一个通过版本号检查网络上是不是存在新的更新文件,并自动通过HTTP下载文件的程序
希望对正在找此类程序的朋友有帮助

本地文件需要一个ver.txt  此文件内容为本地软件版本号
网络上我直接在一个页面上打印出网络存在的版本号
 例如,这个例子里,我在 http://XXX.XXX.XXX/AutoUpdate/ver  这里直接打印出版本号

源文件:http://211.136.109.100/beiouwolf/AutoUpdate.rar 

 

import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.io.*;

public class CheckUpdate extends JFrame {
    JFrame c = this;

    public CheckUpdate() {
        //设置窗体属性
        setAttb();

        JLabel title = new JLabel("正在检查网络上的更新资源...");
        this.add(title, BorderLayout.NORTH);
        JTextArea msg = new JTextArea();
        this.add(msg, BorderLayout.CENTER);
        JLabel process = new JLabel();
        this.add(process, BorderLayout.SOUTH);
       
        //启动更新线程
        new Check(msg, process).start();
    }

    private class Check extends Thread {
        //标识,是否存在新的更新文件
        private boolean isUpdated = false;
        //保存最新的版本
        String netVersion;
        //本地版本文件名
        String LocalVerFileName = "ver.txt";

        //显示信息
        private JTextArea msg;
        private JLabel process;

        public Check(JTextArea msg, JLabel process) {
            this.msg = msg;
            this.process = process;
        }

        public void run() {
            //更新文件版本标识URL
            String versionUrl = "http://XXX.XXX.XXX/AutoUpdate/ver";

            URL url = null;
            InputStream is = null;
            InputStreamReader isr = null;
            BufferedReader netVer = null;

            //读取网络上的版本号
            try {
                url = new URL(versionUrl);
                is = url.openStream();
                isr = new InputStreamReader(is);

                netVer = new BufferedReader(isr);
                String netVerStr = netVer.readLine();
                String localVerStr = getNowVer();

                if (netVerStr.equals(localVerStr)) {
                    msg.append("当前文件是最新版本/n");
                    isUpdated = false;
                } else {
                    msg.append("存在更新文件,现在开始更新.../n");
                    isUpdated = true;
                    netVersion = netVerStr;
                }

            } catch (MalformedURLException ex) {
            } catch (IOException ex) {
            } finally {
                //释放资源
                try {
                    netVer.close();
                    isr.close();
                    is.close();
                } catch (IOException ex1) {
                }
            }

            //如果版本不同,下载网络上的文件,更新本地文件
            if (isUpdated) {
                //本地需要被更新的文件
                File oldFile = new File("client.exe");
                //缓存网络上下载的文件
                File newFile = new File("temp.exe");
               
                //网络上的文件位置
                String updateUrl =
                        "http://XXX.XXX.XXX/downloads/simpkle.exe";

                HttpURLConnection httpUrl = null;
                BufferedInputStream bis = null;
                FileOutputStream fos = null;

                try {
                    //打开URL通道
                    url = new URL(updateUrl);
                    httpUrl = (HttpURLConnection) url.openConnection();

                    httpUrl.connect();

                    byte[] buffer = new byte[1024];

                    int size = 0;

                    is = httpUrl.getInputStream();
                    bis = new BufferedInputStream(is);
                    fos = new FileOutputStream(newFile);

                    msg.append("正在从网络上下载新的更新文件/n");

                    //保存文件
                    try {
                        int flag = 0;
                        int flag2 = 0;
                        while ((size = bis.read(buffer)) != -1) {
                            //读取并刷新临时保存文件
                            fos.write(buffer, 0, size);
                            fos.flush();

                            //模拟一个简单的进度条
                            if (flag2 == 99) {
                                flag2 = 0;
                                process.setText(process.getText() + ".");
                            }
                            flag2++;
                            flag++;
                            if (flag > 99 * 50) {
                                flag = 0;
                                process.setText("");
                            }
                        }
                    } catch (Exception ex4) {
                        System.out.println(ex4.getMessage());
                    }

                    msg.append("/n文件下载完成/n");

                    //把下载的临时文件替换原有文件
                    CopyFile(oldFile,newFile);
                   
                    //把本地版本文件更新为网络同步
                    UpdateLocalVerFile();

                } catch (MalformedURLException ex2) {
                } catch (IOException ex) {
                    msg.append("文件读取错误/n");
                } finally {
                    try {
                        fos.close();
                        bis.close();
                        is.close();
                        httpUrl.disconnect();
                    } catch (IOException ex3) {
                    }
                }
            }

            //启动应用程序
            try {
                msg.append("启动应用程序");
                Thread.sleep(500);
                Process p = Runtime.getRuntime().exec("client.exe");
            } catch (IOException ex5) {
            } catch (InterruptedException ex) {
            }
           
            //退出更新程序
            System.exit(0);
        }
//复制文件
        private void CopyFile(File oldFile, File newFile) {
            FileInputStream in = null;
            FileOutputStream out = null;
           
            try {
                if(oldFile.exists()){
                    oldFile.delete();
                }
                in = new FileInputStream(newFile);
                out = new FileOutputStream(oldFile);

                byte[] buffer = new byte[1024 * 5];
                int size;
                while ((size = in.read(buffer)) != -1) {
                    out.write(buffer, 0, size);
                    out.flush();
                }
            } catch (FileNotFoundException ex) {
            } catch (IOException ex) {
            } finally {
                try {
                    out.close();
                    in.close();
                } catch (IOException ex1) {
                }
            }

        }

        private void UpdateLocalVerFile() {
            //把本地版本文件更新为网络同步
            FileWriter verOS = null;
            BufferedWriter bw = null;
            try {
                verOS = new FileWriter(LocalVerFileName);

                bw = new BufferedWriter(verOS);
                bw.write(netVersion);
                bw.flush();

            } catch (IOException ex) {
            } finally {
                try {
                    bw.close();
                    verOS.close();
                } catch (IOException ex1) {
                }
            }
        }

        private String getNowVer() {
            //本地版本文件
            File verFile = new File(LocalVerFileName);

            FileReader is = null;
            BufferedReader br = null;

            //读取本地版本
            try {
                is = new FileReader(verFile);

                br = new BufferedReader(is);
                String ver = br.readLine();

                return ver;
            } catch (FileNotFoundException ex) {
                msg.append("本地版本文件未找到/n");
            } catch (IOException ex) {
                msg.append("本地版本文件读取错误/n");
            } finally {
                //释放资源
                try {
                    br.close();
                    is.close();
                } catch (IOException ex1) {
                }
            }
            return "";
        }
    }


    private void setAttb() {
        //窗体设置
        this.setTitle("Auto Update");
        this.setSize(200, 150);
        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 窗体居中
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();
        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        this.setLocation((screenSize.width - frameSize.width) / 2,
                         (screenSize.height - frameSize.height) / 2);
    }

    public static void main(String[] args) {
        CheckUpdate checkupdate = new CheckUpdate();
        checkupdate.setVisible(true);
    }
}



java 自动升级sql脚本 flyway 工具 为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行; 别人写的SQL我们不能确定是否都在所有环境执行过了; 有人修改了已经执行过的SQL,期望再次执行; 需要新增环境做数据迁移; 每次发版需要手动控制先发DB版本,再发布应用版本; 其它场景... 由于项目需求的变化,或者前期设计缺陷,导致在后期需要修改数据库,这应该是一个比较常见的事情,如果项目还没上线,你可能把表删除了重新创建,但是如果项目已经上 阅读详情

相关推荐

Java自动升级:控制Java版本的更新

然而,随着时间的推移,Java平台的不断演进,会有新的版本发布,这可能导致某些应用程序出现兼容性问题。为了确保应用程序的稳定性和安全性,我们需要对Java的升级过程进行有效的控制。本文将介绍如何实现Java自动升级的机制,并提供相应的源代码示例。通过以上步骤,我们可以实现Java自动升级的机制。这将确保我们的应用程序始终使用最新的Java版本,从而提高安全性和稳定性。需要注意的是,自动升级过程需要谨慎处理,以避免意外情况和不良影响。通过控制Java版本的更新,我们可以确保应用程序的兼容性和安全性。

CdiBug的博客 875

java软件自动升级

//很早以前的工程项目,比较乱,凑合看吧,希望对你有一点点帮助     //updateDaemonThread       //看了源码发现我记错了,这个线程不是轮循,是加在main.bat里的第2句,第一句就是主app     //主app关闭了,才会执行第2句,比轮循更好一点     import   java.io.*;     import   java.util.Prope

guyu520的专栏 9405

java 自动程序更新

设定 检查目录 程序运行目录 备份目录。 当到检查目录检测到文件后,进行解压缩,同时备份程序运行目录的内容到备份目录,并打上时间戳。 然后把解压缩的内容覆盖到程序运行目录

探索 Java 项目如何实现自动升级

📖本文将以 Jpom 为实际案例分享在 Java 项目中如何实现自动升级的功能。本文满满的干货,希望对大家有所启发或者帮助 🤔。

bwcx_jzy 的博客 820

Java自动升级软件源码.zip

利用socket和监听端口技术,每次发布新的软件版本时只需要将打包好的文件部署到自动升级服务器上,用户运行软件客户端时就会连接到自动升级服务器,检查是否有版本更新,如果有则完成更新后再运行最新版本,否则就运行当前工具版本。

利用FTP服务器来实现Java部署程序的自动更新

利用FTP服务器来实现Java部署程序的自动更新 有博客说明http://blog.youkuaiyun.com/jdk2006/article/details/6705467

java开发自动更新程序_JAVA自动更新程序

最近由于一个工程需要做应用程序启动时,自动更新的项目在GOOGLE上找了半天也没见到什么比较好的办法自己动手写了一个通过版本号检查网络上是不是存在新的更新文件,并自动通过HTTP下载文件的程序希望对正在找此类程序的朋友有帮助本地文件需要一个ver.txt 此文件内容为本地软件版本号网络上我直接在一个页面上打印出网络存在的版本号例如,这个例子里,我在 http://XXX.XXX.XXX/Auto...

weixin_29548281的博客 1818

用Multisim复刻经典收音机:从零搭建超外差中波调幅接收机(附仿真源文件)

本文详细介绍了如何使用Multisim软件从零搭建超外差中波调幅接收机,复刻经典收音机的设计过程。通过模块化搭建、稳定性优化和增益分配等实战指南,帮助读者掌握超外差架构的核心技术,并附赠仿真源文件供实践参考。

weixin_28744423的博客 474

java 自动更新_JAVA自动更新程序

最近由于一个工程需要做应用程序启动时,自动更新的项目在GOOGLE上找了半天也没见到什么比较好的办法自己动手写了一个通过版本号检查网络上是不是存在新的更新文件,并自动通过HTTP下载文件的程序希望对正在找此类程序的朋友有帮助本地文件需要一个ver.txt 此文件内容为本地软件版本号网络上我直接在一个页面上打印出网络存在的版本号例如,这个例子里,我在 http://XXX.XXX.XXX/Auto...

weixin_31043675的博客 1578

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 488

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。

jkh920184196的博客 2382

java程序远程自动更新_您如何远程更新Java应用程序?

小编典典您没有指定服务器应用程序的类型-我将假设您没有在运行Web应用程序(因为部署WAR已经完成了您所谈论的内容,并且您很少需要Web应用程序来执行拉类型如果您正在谈论一个Web应用程序,那么下面的讨论仍然可以适用-您只需为WAR文件而不是单个文件实施更新检查和乒乓球)。您可能想看看jnlp-WebStart基于此(这是一种客户端应用程序部署技术),但是我很确定它可以针对服务器类型应用程序执行更...

weixin_33389310的博客 1429

CATIA P3 V5-6R2023在Windows 11 23H2上的稳定安装与系统级配置指南

CATIA是高端制造业核心的三维参数化设计平台,其运行依赖严格的系统底层支撑。理解CATIA的BRep几何内核原理与Windows子系统(如WSL、Hyper-V)的协同机制,是保障建模稳定性与计算精度的技术前提。CATIA Run-Time Library和OpenGL硬件加速能力共同决定了曲面重建、螺纹建模等关键操作的可靠性;而.NET Framework 3.5、VC++ 2022运行库及显卡Studio驱动的精准匹配,则构成工业软件在Win11环境落地的工程基础。本文聚焦于航空、轨交、能源等领域高频

weixin_30983353的博客 631

给多台机器的Java应用程序写一个自动更新的程序

问题:现有70几台前置机要逐步安装Java应用程序,现已经在10台机器上已经安装了Java应用程序。如果代码有变动的话,只能通过远程桌面连接到前置机的电脑进行手工操作。这样一天时间都荒废在这种无聊的时间上了。 想法:利用已经搭建的FTP服务器来实现前置机程序自动更新,从而解放自己...

chilie9862的博客 275

告别编译报错!STC32G12K128在Keil C251下的完整Target配置指南(附ROM设置详解)

本文详细介绍了STC32G12K128在Keil C251下的完整Target配置指南,包括ROM设置、CPU模式选择、内存模型优化等关键步骤。通过实战技巧和常见错误解决方案,帮助开发者高效搭建编译环境,避免常见报错,充分发挥STC32G系列芯片的性能优势。

weixin_29186249的博客 339

STM32驱动LED矩阵:IS31FL3731与查理复用技术实践

LED矩阵显示是嵌入式系统中常见的人机交互方式,其核心在于高效的驱动技术。查理复用(Charlieplexing)作为一种创新的矩阵扫描方式,通过引脚复用技术,用N个引脚驱动N²-N个LED,大幅提升了硬件资源利用率。IS31FL3731驱动芯片集成了这一技术,配合STM32F410RB微控制器的强大性能,可实现144个LED的精准控制。这种组合在艺术装置、信息展示等场景中展现出独特优势,既能呈现丰富的视觉效果,又能通过内置PWM调光实现256级亮度控制。通过I2C接口通信,开发者可以轻松实现字符显示、图像

weixin_29193359的博客 279

java中automatic,Java(桌面)應用程序的“自動更新”?

What system do you recommend for implementing "automatic updates" for some java (desktop) application? I'd also want to have module/plugin installation and update. Think Eclipse and Firefox.您推薦什么系統來實現...

weixin_29306875的博客 230

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 337

java程序远程自动更新,如何使Java应用程序自动更新?

Problem: I have a standalone Java app (henceforth known as "the agent") that runs as a service on internal company servers. It acts as a remote agent for some central servers. As the agent gets deploy...

weixin_33245968的博客 520

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: Android手机中获取手机号码和运营…
下一篇: 命令运行的判断依据: ; , &…
kf
kf
博客等级 码龄25年 12粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值