背景:用javaFx開發的C/S程序,客戶端須要更新,須要寫個程序,若是有新版本須要提示用戶更新。java
需求:若是有新版本,提示客戶須要更新,客戶根據提示,進入到更新頁面,能夠下載最新客戶端(jnlp文件)。最新的客戶端將下載到C:\\f1(硬性規定,不讓客戶選擇)目錄下,並生成一個批處理文件(bat)並在桌面建立這個批處理文件的快捷方式,客戶直接執行這個批處理文件即進行更新.
服務器
解決辦法:ui
有新版本提示客戶更新比較好實現。每次發佈版本都會生成一個版本號,客戶每次登陸客戶端,客戶端往服務器端發送版本號,若是和服務器端存儲的版本號一致,則沒有要更新的版本,反之則提示客戶須要更新。至於怎麼推送消息,取決於各位。樓主用的是jms.this
java下載也是你們常常用的,不贅述。生成bat文件也下載也同樣,就是IO流的操做。有些人可能腳本文件可能不太會寫,其實很簡單,網上一搜,不少都是現成的。並且就是和在dos命令同樣。難點在於建立這個bat文件的快捷方式。藉助於第三方jar包和一個dll文件。jshortcut.dll,jshortcut.jar。jshortcut.dll文件須要放到和src同一級目錄上。spa
好了,很少說,下面貼代碼,註釋寫的都比較清楚。
code
package com.platform.ui.update; import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import javax.swing.filechooser.FileSystemView; import net.jimmc.jshortcut.JShellLink; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.layout.AnchorPane; public class DownloadFileController extends AnchorPane { @FXML private Button download; @FXML void downloadFile() { // 獲取資源路徑 String tempResourcePath = this.getClass().getClassLoader() .getResource("").getPath(); String resourcePath = tempResourcePath.substring(1, tempResourcePath.indexOf("classes")) + "resource"; String targetPath = "C:\\f1"; File targetFile = new File(targetPath); if (!targetFile.exists()) { targetFile.mkdirs(); } File[] files = new File(resourcePath).listFiles(); for (File file : files) { // File resourceFile = new File(resourcePath); // 以流的形式下載文件。 InputStream fis; try { fis = new BufferedInputStream(new FileInputStream( file.getAbsolutePath())); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); FileOutputStream out = new FileOutputStream(targetFile + "\\" + file.getName()); out.write(buffer); out.flush(); out.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 建立寫入的目標文件 String batPath = "C:\\f1\\run.bat"; File file = new File(batPath); if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } // 寫出流 BufferedWriter output; try { output = new BufferedWriter(new FileWriter(file)); output.write("cd C:\\f1"); output.write("\r\n"); output.write("javaws yk_platform_client.jnlp"); output.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 在桌面建立run.bat快捷方式 FileSystemView fsv = FileSystemView.getFileSystemView(); String writeFolderPath = fsv.getHomeDirectory().toString() + "\\"; // 這即是讀取桌面路徑的方法了 String jarFileName = "C:\\f1\\run.bat";// 創建快捷方式後鼠標放到上面的時候現實的文件所存位置 // create lnk file JShellLink link = new JShellLink(); link.setFolder(writeFolderPath); // 建立的快捷方式所存在的位置,路徑要真實路徑,放到快速啓動欄裏面 link.setName("豪諾ERP更新文件"); // 快捷方式的名稱 link.setIconLocation("C:\\f1\\erp.ico");// 圖片位置 link.setPath(jarFileName); link.setArguments("");// 設置執行參數 link.save(); System.out.println("執行完畢!"); } }
有什麼須要指正或者不明白的地方,歡迎交流。QQ:70747053
orm