gpt4 book ai didi

java - 创建更新程序。更新/下载部分

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:25 25 4
gpt4 key购买 nike

我想创建一个更新程序,但我不确定我想如何做这部分。我希望我的更新程序检查更新,然后计算它必须执行的所有更新,例如:您仍然需要 3/5 的更新。或类似的东西。我知道它会检查是否有可用的更新,如果有更新,则它会直接下载该更新,然后它会检查另一个更新并下载该更新,但我希望它检查所有更新,然后再下载它们。这是启动器类

package com;

import com.check.Checker;
import com.download.DownloadData.DownloadFiles;

public class Launcher {

public static void main(final String[] args) {
for (DownloadFiles df: DownloadFiles.values()) {

String fileName = df.fileName;
String URL = df.URL;

switch(Checker.isLatest(fileName, URL)) {
case 0:
System.out.println("Downloading " + fileName + ".");
break;
case 1:
System.out.println("Updating " + fileName + ".");
break;
case 2:
System.out.println(fileName + " is up to date.");
break;
}
}
}

}

这是 isLatest 方法:

public static byte isLatest(String fileName, String downloadUrl) {
if (!hasFile(fileName)) {
System.out.println("[" + fileName + "]" + "There is no file yet.");
return 0;
}
try {
if (DigestUtils.md5Hex(new FileInputStream(Settings.saveDir)).equalsIgnoreCase(DigestUtils.md5Hex(new URL(downloadUrl).openStream()))) {
System.out.println("[" + fileName + "]" + "Your file is up to date.");
return 2;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("[" + fileName + "]" + "Your file needs to be updated.");
return 1;
}

所以我的问题是:如何让启动器按以下顺序执行:检查更新。列出更新,然后下载更新。

最佳答案

我不完全确定我理解你的问题,但也许你想这样做:

//in Launcher

EnumSet<DownloadFileS> filesToUpdate = checkForUpdates(DownloadFiles.values());

listFilesToUpdate(filesToUpdate);

downloadFiles(filesToUpdate);

然后在 checkForUpdates 中,您只需创建自上次同步以来已更改的文件列表,在 listFilesToUpdate 中,您只需将它们打印出来并在 downloadFiles(filesToUpdate) 中 你下载它们。基本上,您的 isLatest 方法中已经包含所有内容 - 您只需要按职责拆分即可。

更新

public List<DownloadFiles> checkForUpdates(List<DownloadFiles> allFiles) {
allFiles.stream()
.filter(file -> !hasFile(file.getFilename()) || !fileUpToDate(file))
.collect(toList())

private boolean isFileUpToDate(DownloadFiles file) {
return DigestUtils.md5Hex(new FileInputStream(Settings.saveDir))
.equalsIgnoreCase(DigestUtils.md5Hex(new URL(downloadUrl).openStream())));

下一次更新

public static void main(String[] args) {
List<DownloadFiles> filesToUpdate = checkForUpdates(DownloadFiles.values());

listFilesToUpdate(filesToUpdate);

downloadFiles(filesToUpdate);
}

private static void downloadFiles(List<DownloadFiles> filesToUpdate) {
filesToUpdate.stream()
.forEach(file -> downloadFile(file));
}

private static void downloadFile(DownloadFiles file) {
try {
URL website = new URL(file.URL);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(file.filename);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private static void listFilesToUpdate(List<DownloadFiles> filesToUpdate) {
System.out.println("Following files will be updated");
filesToUpdate.stream()
.forEach(System.out::println);
}

public static List<DownloadFiles> checkForUpdates(DownloadFiles[] allFiles) {
return Arrays.asList(allFiles).stream()
.filter(file -> !hasFile(file.filename) || !isFileUpToDate(file))
.collect(Collectors.toList());
}

private static boolean isFileUpToDate(DownloadFiles file) {
try (InputStream is = new URL(file.URL).openStream()) {
return DigestUtils.md5Hex(new FileInputStream(Settings.saveDir))
.equalsIgnoreCase(DigestUtils.md5Hex(is));
} catch (IOException e) {
throw new RuntimeException(e);
}
}

关于java - 创建更新程序。更新/下载部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com